我参加了下两节课:
@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
据我了解,当我们具有OneToMany关系时,经常使用insertable = false和updatble = false。在这种情况下,它只是继承。将insertabl = false,updtable = false添加到在Question类中响应的列时,不会出现错误。我想知道为什么。
答案 0 :(得分:2)
当需要映射鉴别符列时,必须使用insert="false" update="false"
对其进行映射,因为只有Hibernate才能管理该列。如果不映射该列,则出于内部目的,Hibernate会将其视为已声明一次。如果声明它,那是两次,因此是错误。
答案 1 :(得分:0)
这是因为sponsered
已映射SP
中的@DiscriminatorValue
列,该列应始终等于“ true”。
如果您两次映射sponsered
列以进行更新/插入,则Hibernate会感到困惑,因为它不知道应将哪些值用于更新/插入。但是在将sponsered
列更改为只读模式(即insertabl=false
,updtable=false
)之后,hibernate知道应该使用哪些值进行更新/插入,因为只有唯一的事实来源。