应该映射为insert =“ false” update =“ false”

时间:2018-12-15 19:29:26

标签: java hibernate

我参加了下两节课:

@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类中响应的列时,不会出现错误。我想知道为什么。

2 个答案:

答案 0 :(得分:2)

当需要映射鉴别符列时,必须使用insert="false" update="false"对其进行映射,因为只有Hibernate才能管理该列。如果不映射该列,则出于内部目的,Hibernate会将其视为已声明一次。如果声明它,那是两次,因此是错误。

答案 1 :(得分:0)

这是因为sponsered已映射SP中的@DiscriminatorValue列,该列应始终等于“ true”。

如果您两次映射sponsered列以进行更新/插入,则Hibernate会感到困惑,因为它不知道应将哪些值用于更新/插入。但是在将sponsered列更改为只读模式(即insertabl=falseupdtable=false)之后,hibernate知道应该使用哪些值进行更新/插入,因为只有唯一的事实来源。