我已经从Hibernate 4.2.2迁移到5.1.2,现在我在使用 @Inheritance(strategy = InheritanceType.JOINED) 存储超类时遇到了问题 .

我的推广实体是:

@Entity
@Table(name = "promotion")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "promotion_type", discriminatorType = DiscriminatorType.STRING)
@XmlRootElement
public class Promotion implements Serializable {…
…
…
@Basic(optional = false)
@Column(name = "promotion_type", nullable = false, length = 17)
protected String promotionType;
…
…
}

其中一个扩展类是PromotionEvent:

@Entity
@Table(name = "promotion_event")
@PrimaryKeyJoinColumn(name = "promotion_id")
@DiscriminatorValue("event")
@XmlRootElement
public class PromotionEvent extends Promotion {
…
…
}

在Hibernate 4.2.2中,一切正常,但现在使用Hibernate 5.1.2存储促销时,我得到以下异常: ERROR pool-2-thread-2 SqlExceptionHelper.logExceptions - Parameter index out of range (16 > number of parameters, which is 15).

使用insert:insert into promotion(amount,client_id,description,end_datetime,event_end_datetime,event_start_datetime,hide_amount_at_ticket,name,percentage,promotion_type,requires_pda_alert,short_name,show_amount_original_at_ticket,start_datetime,state,status)值(?,?,?,?, ?,?,?,?,?,'event',?,?,?,?,?,?)

所以,似乎是试图在指定的 @DiscriminatorColumn 中插入de @DisciminatorValue 的PromotionEvent,但 @DisicriminatorColumn@Basic 然后保持不变 . 所以,这是问题所在 . 但是,为什么在Hibernate 4.x中没有发生这种情况?

我可以看到,如果我做的话它会起作用

@Basic(optional = false)
@Column(name = "promotion_type", nullable = false, insertable=false, length = 17)
protected String promotionType;

也就是说, insertable=false ,然后它工作, @DiscriminatorValue 插入promotion_type .

此外,如果我从Promotion中删除 @DiscriminatorColumn ,似乎一切正常,但在这种情况下我不知道Hibernate如何知道类类型(我猜是使用JOINED策略) .

  • 应该建议使用insertable = false吗?

  • 如果它全部正常工作,应该删除 @DiscriminatorColumn 吗?

  • 不能 @DiscriminatorColumn 一个 @Basic 和可插入属性?,为什么在H4.2.2中没有问题?

谢谢 .