2014-04-04 101 views
1

我從jBPM 5.4轉換到jBPM 6並相應地更新現有值的數據庫。休眠的SequenceStyleGenerator生成序列低於獲得的序列值

大部分情況已經很好,除了在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範圍內,因此導致我唯一的約束違規。

回答

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