1. 开发环境介绍
Spring Data 1.6, JDK 1.6, Oracle 11g, Hibernate 4.3.5
2. 问题的提出
在开发中,使用Annotation来配置Entity,即对象与Table的映射;代码示例如下:
@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; ...... }
随机的ID会被插入数据库,ID为50, 150, 1050之类的递增:
2. 问题分析
数据库本身经过分析,没有问题,工作正常;数据库表的创建语句也经过验证没有问题;最后经过分析,还是确定应该是代码的问题。原来的时候,使用Trigger来定义ID字段的自增,现在改用Annotation中的SequenceGenerator, 新出现的问题。
是否是generator定义本身的问题呢? 经过检查和验证,没有问题。
还是上网搜索吧, 终于看到了一个未曾用过的字段 allocationSize.
3. 问题的解决
修正之后的代码如下:
@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; ........ }
4. 什么是allocationSize?
在源代码的定义中,其缺省值为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
时间: 2024-10-01 21:03:25