Вызывает ли расширение базового класса и обоих классов, имеющих аннотацию @Id, повторяющийся столбец в сопоставлении для сущности? - PullRequest
0 голосов
/ 10 июня 2018

У меня есть два класса.Один класс расширяет другой.Оба класса будут сохранены в базе данных.Почему я все еще получаю: Причина: org.hibernate.MappingException: повторяющийся столбец в сопоставлении для сущности: com.ct.www.model.Bt column: q_Id (должен отображаться с помощью insert = "false" update = "false")

Questions.class

@Entity
@Table(name="Questions")
@Access(value = AccessType.FIELD)
public class Questions implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    //@Access(value= AccessType.FIELD)
    private String q_Id;

    @Column(name="q_type")
    private String q_Type;

    @Column(name="q_lang")
    private String q_lang;

    @Access(value = AccessType.PROPERTY)
    public String getQ_Type() {
        return q_Type;
    }

    public void setQ_Type(String q_Type) {
        this.q_Type = q_Type;
    }

    @Id
    @Column(name="q_Id")
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Access(value = AccessType.PROPERTY)
    public String getQ_Id() {
        return q_Id;
    }

    public void setQ_Id(String q_Id) {
        this.q_Id = q_Id;
    }

    @Access(value = AccessType.PROPERTY)
    public String getQ_lang() {
        return q_lang;
    }

    public void setQ_lang(String q_lang) {
        this.q_lang = q_lang;
    }

}

BT.class

@Entity
@Table(name="BT")
@Access(value = AccessType.FIELD)
public class BT extends Questions implements Serializable{

    private static final long serialVersionUID = 1L;

    @Access(value = AccessType.FIELD)
//  @Id 
//  @Column(name="q_Id")
    private String q_Id;

    @Access(value = AccessType.PROPERTY)
    public String getQ_Id() {
        return q_Id;
    }

    public void setQ_Id(String q_Id) {
        this.q_Id = q_Id;
    }

//  @OneToOne(cascade = CascadeType.ALL)
//  @PrimaryKeyJoinColumn
//  @JoinColumn(name="q_id")
//  @MapsId
    private Questions question;

    public Questions getQuestion() {
        return question;
    }

    public void setQuestion(Questions question) {
        this.question = question;
    }
}

Один из моих вариантов использования - это Вопросы, и BT будет сохранен отдельно в соответствующих таблицах в MySQL (Вопросыстол и стол БТ).BT это тип Вопроса.Поэтому я решил расширить его.Обе таблицы имеют первичный ключ Id, и мой класс DAO сначала будет вставлен в таблицу вопросов и будет использовать тот же Id для класса BT, который позже будет вставлен в таблицу BT.

1 Ответ

0 голосов
/ 10 июня 2018

Расширение базового класса, который является Entity, вызовет эту проблему.

Вы можете:

  • Удалить общие сопоставленные поля / свойства из дочернего класса
  • Добавить @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) над родительским классом для вашего варианта использования.

См., Например, Раздел 2.11.4 в Hibernate-5.3.1. Окончательное руководство пользователя .

Если вам нужна другая стратегия генерации в родительском и дочернем элементах, вы можете переопределить метод getQ_Id() в дочернем и реализовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...