Spring Data在Oracle中的自增ID隨機出現的問題解決
1. 開發環境介紹
Spring Data 1.6, JDK 1.6, Oracle 11g, Hibernate 4.3.5
2. 問題的提出
在開發中,使用Annotation來配置Entity,即物件與Table的對映;程式碼示例如下:
隨機的ID會被插入資料庫,ID為50, 150, 1050之類的遞增:@Entity(name = "PayOrderEntity") @Table(name = "ES_OUTPAY_ORDER") public class OrderEntity extends AuditableBaseEntity { @Id @Column @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "orderGenerator") @SequenceGenerator(name = "orderGenerator", sequenceName = "outpay_order_sequence") private long id; ...... }
2. 問題分析
資料庫本身經過分析,沒有問題,工作正常;資料庫表的建立語句也經過驗證沒有問題;最後經過分析,還是確定應該是程式碼的問題。原來的時候,使用Trigger來定義ID欄位的自增,現在改用Annotation中的SequenceGenerator, 新出現的問題。
是否是generator定義本身的問題呢? 經過檢查和驗證,沒有問題。
還是上網搜尋吧, 終於看到了一個未曾用過的欄位 allocationSize.
3. 問題的解決
修正之後的程式碼如下:
4. 什麼是allocationSize?@Entity(name = "PayOrderEntity") @Table(name = "ES_OUTPAY_ORDER") public class OrderEntity extends AuditableBaseEntity { @Id @Column @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "orderGenerator") @SequenceGenerator(name = "orderGenerator", sequenceName = "outpay_order_sequence", allocationSize=1) private long id; ........ }
在原始碼的定義中,其預設值為50,故會出現50/51的ID。 在JPA中,其ID是通過allocationSize來設定其變化Size的。
參考資料:
1. http://stackoverflow.com/questions/12745751/hibernate-sequencegenerator-and-allocationsize
2. http://royontechnology.blogspot.hk/2010/04/note-on-allocationsize-parameter-of.html