【问题标题】:DuplicateMappingException Table [] contains physical column name [] referred to by multiple logical column names: [_id], [Id]DuplicateMappingException 表[]包含多个逻辑列名引用的物理列名[]:[_id]、[Id]
【发布时间】:2020-04-29 19:33:26
【问题描述】:

我正在重写一个项目,但我遇到了构建问题。

Caused by: org.hibernate.DuplicateMappingException: Table [language] contains physical column name [person_id] referred to by multiple logical column names: [person_id], [personId]

在哪里

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@IdClass(LanguagePK.class)
@Table(name = "language")
public class Language {
    @Id
    @Column(name = "person_id")
    private int personId;
    @Id
    @Column(name = "position")
    private int position;
    @Id
    @Column(name = "language_name")
    private String languageNameVal;
    @Column(name = "language_level")
    private String languageLevelVal;
    @ManyToOne
    @JoinColumn(name = "person_id", referencedColumnName = "id", nullable = false, insertable = false,updatable = false)
    @JsonBackReference(value = "languages")
    private Person person;
    @ManyToOne
    @JoinColumn(name = "language_name", referencedColumnName = "name", nullable = false, insertable = false,updatable = false)
    @JsonIgnore
    private LanguageName languageName;
    @ManyToOne
    @JoinColumn(name = "language_level", referencedColumnName = "level", nullable = false, insertable = false,updatable = false)
    @JsonIgnore
    private LanguageLevel languageLevel;
}

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "person")
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

@JsonManagedReference(value = "languages")
    @OneToMany(mappedBy = "person", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private Set<Language> languages;

我用

  • 休眠版本 5.4.13.Final
  • spring-boot v. 2.2.5.RELEASE
  • 分级
  • java 1.8
  • 龙目岛

这些变化非常小,就像我使用 maven、SessionFactory 用于休眠、传统的 getter 和 setter 之前一样。

我在 hibernate 4 和 5 之间的迁移过程中看到了一些类似的问题,其中 NamingStrategy 是一个问题,但是此代码适用于 hiberante 为 5.4.10.Final 的第一个项目。

我喜欢 IdClass,因为我可以将 personId 作为原始值访问,并且不必从对象 person 加载数据。

我在没有insertable = false,updatable = false 的情况下看到了类似的问题,但我有它......

发现类似问题here

【问题讨论】:

    标签: java hibernate jpa lombok


    【解决方案1】:

    解决方案

    问题在于访问策略字段与属性访问。

    在之前的项目中,一切都是基于属性的访问,但在我添加 lombok 之后,Language 类是基于字段的访问。

    LanguagePK 的班级是

    public class LanguagePK implements Serializable {
        private static final long serialVersionUID = 1L;
        private int personId;
        private int position;
        private String languageNameVal;
    
        @Column(name = "person_id")
        @Id
        public int getPersonId() {
            return personId;
        }
    
        public void setPersonId(int personId) {
            this.personId = personId;
        }
    
        @Column(name = "position")
        @Id
        public int getPosition() {
            return position;
        }
    
        public void setPosition(int position) {
            this.position = position;
        }
    
        @Column(name = "language_name")
        @Id
        public String getLanguageNameVal() {
            return languageNameVal;
        }
    
        public void setLanguageNameVal(String languageNameVal) {
            this.languageNameVal = languageNameVal;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            LanguagePK that = (LanguagePK) o;
    
            if (personId != that.personId) return false;
            if (position != that.position) return false;
            if (languageNameVal != null ? !languageNameVal.equals(that.languageNameVal) : that.languageNameVal != null)
                return false;
    
            return true;
        }
    
        @Override
        public int hashCode() {
            int result = personId;
            result = 31 * result + position;
            result = 31 * result + (languageNameVal != null ? languageNameVal.hashCode() : 0);
            return result;
        }
    }
    

    够用了

    @EqualsAndHashCode
    public class EducationPK implements Serializable {
        private int personId;
        private int position;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 2019-01-26
      • 2014-09-21
      • 2020-01-01
      • 2017-06-03
      • 2018-02-22
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多