Spring Data在Oracle中的自增ID随机出现的问题解决

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之类的递增:

   Spring Data在Oracle中的自增ID随机出现的问题解决_第1张图片    

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

你可能感兴趣的:(java,spring,oracle,jpa,Data,11g)