码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-03-06 19:14:44      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:oracle 11g   spring data   java   jpa   

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

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

标签:oracle 11g   spring data   java   jpa   

原文地址:http://blog.csdn.net/blueheart20/article/details/44101813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!