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

时间: 2024-10-01 21:03:25

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

oracle中实现自增id

在一些数据库(例如mysql)中,实现自增id只要在建表的时候指定一下即可, 但是在oracle中要借助sequence来实现自增id, 要用上自增id,有几种方式: 1.直接在insert语句中使用sequence的nextval. 2.在建表时为字段设置default,这种方式我还没测试. 3.使用触发器,关于触发器的方式,从别人那得到了一个示例,暂且先贴到这里作为备忘.我觉得如果default方式如果可用的话,会比使用触发器的方式简单. 以下是触发器方式相关的代码: CREATE TABL

oracle中设置自增主键

首先,你要有一张表!CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME VARCHAR(25),PHONE VARCHAR(10),ADDRESS VARCHAR(50));如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶!然后,你需要一个自定义的sequenceCREATE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加几个START WITH

MyBatis在Oracle中插入数据并返回主键的问题解决

引言:  在MyBatis中,希望在Oracle中插入数据之时,同时返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle, Spring 3.2   SQL Snippet in XML Configuration: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType="

解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题

https://blog.csdn.net/shaojunbo24/article/details/50036859 问题:mysql表中删除自增id数据后,再添加数据时,id不会紧接.比如:自增id 1 2 3 4 现在删除4,就变成了 1 2 3 这时候,如果增加一条数据,会变成 1 2 3 5 上面5不是我们想要的结果,4才是理想的id,解决方法是,在删除4之后,执行下面的sql语句: ALTER TABLE table_name AUTO_INCREMENT = 1; 原文地址:http

Spring Data之@Query中的org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML

1. 环境准备 Spring , Spring Data, JPA, HIbernate, JDK 1.7 2.  问题提出 在使用Spring Data 来更新数据之时,爆出了如下错误信息: @Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2") public void updateAllUsers(long state, long serverid); 错误信息如下: org.springframework.d

Oracle中创建自增字段方法

oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: 1.创建一个表 create table t_client (id number(4) primary key, pid number(4) not null, name varchar2(30) not null, client_id varchar2(10), client_level char(3), bank_acc

Oracle中创建自增字段(序列sequence)方法

oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: 1.创建一个表 create table t_client (id number(4) primary key, pid number(4) not null, name varchar2(30) not null, client_id varchar2(10), client_level char(3), bank_acc

MySQL获得指定数据表中auto_increment自增id值的方法及实例

http://kb.cnblogs.com/a/2357592/很多情况下,我们要提前用到当前某个表的auto_increment自增列id,可以通过执行sql语句来查询到这个id值. show table status where name=’表名’ 或者 show table status like ‘表名’ 然后从查询到的结果集中获得auto_increment的值 代码实例:<?php mysql_connect("localhost","root",

Oracle中的自增-序列-SEQUENCE

Oracle 12c 之前的版本都没有自增列,如果需要使用自增列,则需要借助SEQUENCE. DROP TABLE CUSTOMERORDER PURGE; CREATE TABLE CUSTOMERORDER ( ORDERID NUMBER NOT NULL, PRODUCTID NUMBER, PRODUCTNAME VARCHAR2(50), CONSTRAINTS PK_ORDERID PRIMARY KEY(ORDERID) ); DROP SEQUENCE SQ_ORDERID;