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

       

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值