DuplicateMappingException表[]包含由多个逻辑列名称引用的物理列名称[]:[_id],[Id]

时间:2020-04-29 19:33:26

标签: java hibernate jpa lombok

我正在重写一个项目,但是有一个构建问题。

 sudo update-alternatives --config java

其中

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;
}

我使用

  • 休眠v.5.4.13。最终
  • spring-boot v.2.2.5.RELEASE
  • gradle
  • java 1.8
  • 龙目岛

与我之前使用maven,SessionFactory休眠,传统的getter和setter一样,更改非常小。

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

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

在没有@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; 的情况下,我也遇到了类似的问题,但是我有...

发现了类似的问题here

1 个答案:

答案 0 :(得分:0)

解决方案

问题出在访问策略字段vs属性访问上。

在上一个项目中,所有内容都是基于属性的访问,但是在我添加了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;
}