должно быть отображено с помощью вставки = "ложь" обновление = "ложь" - PullRequest
0 голосов
/ 15 декабря 2018

Я получил следующие 2 класса:

@Entity
@Table(name="questions")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="is_sponsered")
@SequenceGenerator(name="id_seq")
  public class Question {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="id_seq")
protected int id;

@Column(name="is_sponsered",nullable=false)
protected boolean sponsered=false;

....}

и подкласс:

@Entity
@DiscriminatorValue("true")

public class SP extends Question{

public SP(String q)
{
    super(q);
    this.sponsered=true;
}

Однако я получаю следующую ошибку:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: SP column: is_sponsered 

Из того, что я понял, inserttable = false и updatble = false часто используются, когда у нас есть отношение OneToMany.В этом случае это просто наследство.При добавлении inserttabl = false, updtable = false в столбец, созданный в классе Question, ошибка не появляется.Я хотел понять, почему ..

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Это потому, что sponsered столбцы в SP уже сопоставлены с @DiscriminatorValue, который всегда должен быть равен "true".

Если дважды отобразить sponsered столбцы для обновления / вставки, Hibernate запутается, так как не знает, какие значения следует использовать для обновления / вставки.Но после изменения столбца sponsered в режим только для чтения (т. Е. insertabl=false, updtable=false) hibernate знает, какие значения следует использовать для обновления / вставки, поскольку существует только один источник правды.

0 голосов
/ 15 декабря 2018

Когда вам нужно отобразить столбец дискриминатора, вам придется сопоставить его с insert="false" update="false", потому что только Hibernate управляет столбцом.Если вы не отобразите столбец, Hibernate считает его объявленным один раз для внутренних целей.Если вы объявите это, это дважды, отсюда и ошибка.

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