hibernnate 使用Oracle的sequence为对象生成主键 自增50的问题

  前段时间在做一个SSH的项目,使用Oracle中的sequence作为对象表的主键生成策略,在数据库中已经配置好了sequence的步长为1,可是在运行测试时,发现主键ID每次增加的步长是50。

  奇怪之余Google一下,找到如下的解决方案,在对实体类的ID进行注解时,加上一句"allocationSize=1",例如对表EL的主键配置了一个序列叫"EL_SEQ",那么在getId方法上面使用如下注解即可解决。

@SequenceGenerator(name="seqGenerator", sequenceName="EL_SEQ",allocationSize=1)

一下纯属猜测,待后面测试

后来大概浏览量一下原因,很多网友说是cache的问题,猜测是在项目启动时,hibernate会一次性从数据库中取50个ID缓存在内存里,之后save对象时就从内存分配避免频繁向数据库取nextval,从而可以轻微的提高数据库性能。而测试用例每次都会重启hibernate,导致ID以50的步长增加。

附上链接

http://stackoverflow.com/questions/5346147/hibernate-oracle-sequence-produces-large-gap

时间: 2024-10-31 02:00:52

hibernnate 使用Oracle的sequence为对象生成主键 自增50的问题的相关文章

oracle数据库中的表设置主键自增

oracle中没有自增字段,可通过序列+触发器间接实现,cmd中sqlplus登录,直接运行即可.一般要经过一下几步: 1建立数据表 create table Test_Increase(           userid number(10) primary key,  /*主键,自动增加*/           username varchar2(20)           ); 2创建自动增长序列 CREATE SEQUENCE TestIncrease_Sequence INCREMEN

Oracle 学习----:创建表(主键自增)

一.创建表 create table testTable ( Id numbere, name varchar2(100), age number, createTime date, primary key(Id) ) 二.创建序列 create sequence seq_test 三.创建触发器 create or replace trigger autoId before insert on testTable for each Row when (NEW.ID is null) begin

ORACLE uuid自动生成主键

-- Create table create table TECHNOLOGYCOMPANY ( ID VARCHAR2(32) default SYS_GUID() not null, FLOWID VARCHAR2(50), CONPANYID NUMBER, ISCOMMUNICATION VARCHAR2(10) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1

ibatis实战之插入数据(自动生成主键)

--------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert>元素的一个专用子元素)来获取这些自动生成的主键的值并将其保存在对象中.完成这项工作可以有两种方式,具体选择何种方式由你所使用的具体的主键生成技术来确定. 第一种方式是,当你把记录插入到数据库中并且数据库为该记录自动生成了主键值之后,就立即抓取该键值.此时要注意的是,必须确保所使用的数据库驱动程序确实能返回你执行上一条insert语句所得到的键值.

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="

oracle主键自增(1) 序列+触发器实现Oracle主键自增

序列+触发器实现Oracle主键自增 序列的语法格式为: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的. START WITH 定义Oracle序列的初始值(即产生的第一个值),

Mycat探索之旅(4)----Mycat的自增长主键和返回生成主键ID的实现

说明:MyCAT自增长主键和返回生成主键ID的实现 1) mysql本身对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0:这里做一个简单的测试 创建测试表 -------------------------------------- --创建测试表 ------------------------------------- USE test; CREATE TABLE IF NOT EXISTS t_auto_increment ( id INT NOT NULL

oracle 触发器实现主键自增

drop table book; --创建表 create table book( bookId varchar2(4) primary key, name varchar2(20) ); --创建序列 create sequence book_seq start with 1 increment by 1; --创建触发器 create or replace trigger book_trigger before insert on book for each row begin select

Oracle主键自增

1.创建table 1 CREATE TABLE demo6 2 ( 3 id INT NOT NULL, 4 key1 VARCHAR2(40) NULL, 5 key2 VARCHAR2(40) NULL 6 ); 2.设置主键 1 alter table demo6 add constraint demo6_pk primary key (id); 3.新建序列 1 create sequence demo6_id 2 minvalue 1 3 nomaxvalue 4 increment