DuplicateMappingException Table [] содержит физическое имя столбца [], на которое ссылаются несколько логических имен столбцов: [_id], [Id] - PullRequest
0 голосов
/ 29 апреля 2020

Я переписываю проект, и у меня возникает проблема со сборкой.

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;

Я использую

  • hibernate v. 5.4.13.Final
  • spring-boot v. 2.2.5.RELEASE
  • gradle
  • java 1.8
  • lombok

Изменения очень незначительны, как до того, как я использовал maven, SessionFactory для гибернации, традиционные методы получения и установки.

Я видел некоторые похожие проблемы, когда во время работы NamingStrategy возникала проблема миграция между hibernate 4 и 5, но этот код работает в первом проекте, где hiberante - 5.4.10.Final.

Мне нравится IdClass, потому что у меня есть доступ к personId в качестве примитивного значения и мне не нужно загружать данные от объекта person.

Я видел похожие проблемы без insertable = false,updatable = false, но у меня это есть ...

Обнаружена симилиарная проблема здесь

1 Ответ

0 голосов
/ 30 апреля 2020

Решение

Проблема была в поле стратегии доступа против доступа к свойству.

В предыдущем проекте все было с доступом на основе свойств, но после Я добавил ломбок, класс 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...