Hibernate的SequenceStyleGenerator生成序列低于获得的序列值

时间:2014-04-04 07:43:25

标签: java hibernate jbpm

我将jBPM 5.4转换为jBPM 6并相应地更新现有值的数据库。

大多数情况都很好,除了WorkItemInfo表中我得到的序列不正确。正在生成的ID在已经采用的范围内,从而导致唯一的约束违规。

打开调试日志记录后,我看到以下内容:

09:34:53,901 DEBUG [org.hibernate.id.enhanced.SequenceStructure] (EJB default - 1) Sequence value obtained: 81993
09:34:53,910 DEBUG [org.hibernate.event.internal.AbstractSaveEventListener] (EJB default - 1) Generated identifier: 81943, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator

我的问题是,为什么它会产生一个低于当前序列的值(81943 vs 81993)?此生成的值落在已使用的ID范围内,因此导致我的唯一约束违规。

1 个答案:

答案 0 :(得分:2)

看来WorkItemInfo正在使用默认的Hibernate分配大小。 这意味着hibernate很可能会使用TableHiLoGenerator,简而言之,Hibernate将使用序列并减去分配大小。

您的序列很可能递增1,Hiberate使用默认值50作为分配大小。这可以解释为什么你的序列有50的差异(81943 - 50 = 81993)。

没有更改hibernate代码以使分配大小为1(最佳实践);我的建议是将序列更改为键+ 1的最大值,并将增量从1增加到50.

refrences:

http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/id/TableHiLoGenerator.html http://tech.lds.org/wiki/Hibernate%2c_JPA%2c_and_Sequences