oracle在hibernate.中实现自增主键

合集下载

Hibernate主键生成几种常用方式

Hibernate主键生成几种常用方式

Hibernate主键生成几种常用方式这里介绍Hibernate主键生成几种常用方式,由Hibernate根据不同的数据库方言,自行判断采用identity、hilo、sequence其中一种作为Hibernate主键生成方式。

Hibernate主键还是比较常用的,于是我研究了一下Hibernate主键生成,在这里拿出来和大家分享一下,希望对大家有用。

1.assigned:主键由外部程序负责生成,无需Hibernate参与。

----如果要由程序代码来指定主键,就采有这种.2.increment:对 long , short 或 int 的数据列生成自动增长主键。

increment主键生成方式的特点是与底层数据库无关性,大部分数据库如 Mysql,MSSQL 和ORACLE等都支持increament 生成方式。

此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。

increment方式的不足之处是当多个线程并发对数据库表进行写操作时,可能出现相同的主键值,发生主键重复的冲突,因此多线程并发操作时,不应该使用此方法。

3.identity:如果数据列的类型是 long, short 或 int ,可使用主键生成器生成自动增长Hibernate主键。

与底层数据库有关,要求数据库支持identify,如MySQL中是auto_increment,SQL Server中是Identify.支持的数据库有MySQL,SQL Server,DB2,Sybase 和HypersonicSQL.(好像不支持oracle) 无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。

identity的优点是不会发生 increment方式的并发错做问题。

数据库涉及到的表要设置自动增长。

4.sequence:在ORACLE等数据库中使用sequence生成主键。

oracle数据库创建表且主键自增

oracle数据库创建表且主键自增

oracle数据库创建表且主键⾃增唠叨⼏句:⼏年前的知识忘却了,整理⼀下笔记,提供⼀下⽅便1、创建数据库表设置主键create table users( userid number(10) primary key, /*主键,⾃动增加*/ username varchar2(20));附删除表:drop table users;2、创建序列⾃增CREATE SEQUENCE user_Sequence INCREMENT BY 1 -- 每次加⼏个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最⼤值 NOCYCLE -- ⼀直累加,不循环 CACHE 100;附删除序列: DROP SEQUENCE user_Sequence创建好序列之后,就⼿动可以添加数据了,可以多执⾏⼏次insert into users(userid ,username ) values(user_Sequence.nextval,'范伟');查询表数据看看效果select userid ,username from users3、那么问题来了,在oracle客户端这样操作是可以的。

关键是怎么融⼊到实际开发中呢?创建触发器试试!!create or replace trigger users_trigger --users_trigger 触发器名称before insert on users --users是表名for each rowdeclarenextid number;beginIF :erid IS NULL or :erid=0 THEN --userid是列名select user_Sequence.nextval --user_Sequence 正是刚才创建的序列into nextidfrom sys.dual;:erid:=nextid;end if;end users_trigger ; --users_trigger 触发器名称附删除触发器:drop trigger users_trigger;再次插⼊数据试试效果吧insert into users(username ) values('本⼭');。

oracle表空间自增长机制

oracle表空间自增长机制

oracle表空间自增长机制摘要:1.Oracle 表空间的概念和作用2.Oracle 表空间自动增长机制的原理3.Oracle 表空间自动增长的实现方法4.Oracle 表空间自动增长的优缺点5.Oracle 表空间自动增长的实用案例正文:一、Oracle 表空间的概念和作用Oracle 表空间是Oracle 数据库中用于存储表和索引数据的逻辑区域。

在Oracle 数据库中,表空间是分配给表和索引的最小存储单位,它可以看作是一个独立的存储区域,可以根据需要进行扩展和缩减。

通过创建表空间,可以将数据分散存储在多个物理磁盘上,提高数据库的存储容量和性能。

二、Oracle 表空间自动增长机制的原理Oracle 表空间自动增长机制是指当表空间的数据文件大小达到其最大容量时,Oracle 数据库会自动为该表空间分配一个新的数据文件,并将原有数据文件中的数据自动迁移到新的数据文件中,从而实现表空间的扩展。

在这个过程中,表空间的大小会根据数据文件的大小自动增长。

三、Oracle 表空间自动增长的实现方法要实现Oracle 表空间的自动增长,需要进行以下步骤:1.创建表空间:使用CREATE TABLESPACE 语句创建一个新的表空间,并指定数据文件的路径、大小和自动增长选项。

例如:```CREATE TABLESPACE sirm2DATAFILE "d:oracleproduct10.2.0oradataorclsirm2.dbf" SIZE 1024M AUTOEXTEND ON NEXT 10MMAXSIZE UNLIMITED;```2.设置表空间自动增长:在创建表空间时,需要设置AUTOEXTEND 选项为ON,以便在数据文件达到最大容量时自动增长表空间。

同时,可以通过设置EXTENT MANAGEMENT LOCAL 和AUTOALLOCATE SEGMENT SPACE 选项来优化表空间的自动增长功能。

Oracle数据库学习笔记_Oracle添加主键primarykey的四种方法

Oracle数据库学习笔记_Oracle添加主键primarykey的四种方法

Oracle数据库学习笔记_Oracle添加主键primarykey的四种⽅法创建主键oracle主键添加语句通常紧跟在建表语句之后,也可以直接嵌在列声明⾥创建,oracle创建主键时会⾃动在该列上创建索引。

常见⽅法⼤概有以下5种:⽅法⼀、使⽤add constraint ⽅法添加主键约束alter table 表名 add constraint 主键名 primary key (列名1,列名2,...)⽅法⼆、使⽤索引创建主键(和⽅法⼀没有区别,可以将⽅法⼀理解为省略了using index)alter table 表名 add constraint 主键名 primary key (列名1,列名2,...)using index [index_name];当省略using index后⾯的index_name时,创建主键的同时创建同名索引;当使⽤已有索引index_name创建主键时,注意索引列和主键列应该相同才能创建成功。

⽅法三、直接添加主键alter table 表名 add primary key (列名1,列名2,...) ;同样,创建主键的同时创建同名索引。

⽅法四、参数列内添加主键create table ALERT_RESULT_EVENT_C(data_date VARCHAR2(8) not null,object_id VARCHAR2(600) not null,event_id VARCHAR2(20) not null,ratio NUMBER(22,4),pairing_object_id VARCHAR2(128),index_value_1 VARCHAR2(128),index_value_2 VARCHAR2(128),constraint PK_ALERT_RESULT_EVENT_C primary key (DATA_DATE, OBJECT_ID, EVENT_ID));删除主键alter table 表名 drop primary key ;采⽤该语句删除主键时,同名索引也会被删掉。

ORACLE数据库实现主键自增

ORACLE数据库实现主键自增

ORACLE数据库实现主键⾃增ORACLE数据库是甲⾻⽂公司的⼀款关系数据库管理系统。

实现主键⾃动增长需要四个步骤:1.创建表格(必须有主键)-- 创建学⽣表(student)主键为:s_idCREATE TABLE student(s_id NUMBER(10) NOT NULL PRIMARY KEY ,-- 主键列 s_ids_name VARCHAR2(50), -- 学⽣姓名 s_names_age NUMBER(8) -- 学⽣年龄 s_age);2.创建⾃增序列-- 创建⾃增序列(seq_student)CREATE SEQUENCE seq_studentINCREMENT BY1--每次增加1,可以写⾮0的任何整数START WITH1-- 从1开始(起始值)MAXVALUE 999-- 设置最⼤值:设置为 NOMAXVALUE 表⽰⽆最⼤值MINVALUE 1-- 设置最⼩值NOCYCLE -- 不循环⼀直增加CACHE 20; -- 设置20个缓存,不使⽤缓存则写 NOCACHE到这⼀步就可以使⽤了,不过使⽤的时候必须按格式调⽤格式:⾃增序列的名字.nextval (我这⾥的序列名为seq_student )insert into student values (seq_student.nextval,'李四',28);3.创建触发器(插⼊数据时触发)create trigger tri_student_ins --每个触发器名不可⼀样before insert on student for each row when (new.s_id is null) --student:换为⾃⼰的表名;s_id 换为⾃⼰的主键名beginselect seq_student.nextval into:new.s_id from dual; -- seq_student:换为上⼀步创建的⾃增序列名;s_id 换为主键名end;4.插⼊数据测试insert into student values (DEFAULT,'测试',28);注意点:1.创建表格时:必须有主键!2.创建⾃增序列时:序列名不要太复杂,id⾃增根据功能灵活变通!3.创建触发器时:根据⾃⼰的表名,主键名,序列名更换需要更换的位置。

利用hibernate实现oracle(每张表的ID)自动增长

利用hibernate实现oracle(每张表的ID)自动增长

利⽤hibernate实现oracle(每张表的ID)⾃动增长设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建⼀个sequence例如创建⼀个序列:CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE; hibernate映射⽂件的配置:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.liyanframework.demo.domain"><class name="Department" table="DEPARTMENT"><id name="id" column="ID"><generator class="sequence"><param name="sequence">DEPARTMENT_ID_SEQ</param></generator></id><property name="name" column="NAME" type="string" /><property name="description" column="DESCRIPTION" type="text" /></class></hibernate-mapping>在 hibernate映射⽂件中,对ID的⽣成策略选择sequence,指定sequence的名字DEPARTMENT_ID_SEQ就可以了,当你保存新对象的时候,hibernate会⾃动取得DEPARTMENT_ID_SEQ.NEXTVAL作为新对象的ID保存到数据库,所以不需要再使⽤触发器再来⽣成新记录的ID。

Oracle数据库中创建自增主键的实例教程

Oracle数据库中创建自增主键的实例教程

Oracle数据库中创建⾃增主键的实例教程在设计数据库表的时候发现Oracle没有⾃增主键的设置,Google了解到Oracle本⾝并不⽀持⾃增主键,需要通过序列(Sequence)和触发器(Trigger)实现。

创建表StudentCreate Table Student(id number(12) primary key, --通过序列和触发器实现id的⾃增name varchar2(20) ,age number(3) ,sex number(1))创建序列SequenceCreate Sequence SEQ_STUDENTminvalue 1maxvalue 99999999999999999999start with 1 --从1开始increment by 1 --增量为1cache 0order;创建触发器TriggerCreate or Replace Trigger STUDENT_AUTOINCREMENTBefore Insert on StudentFor Each RowWhen (NEW.ID IS NULL)BeginSelect SEQ_STUDENT.NEXTVAL INTO :NEW.ID FROM DUAL;End;注意点:1:⼀个sequence可以被多个表共享。

2:被多个表共享的sequence⽣成的数字序列始终连续,不会重新开始。

3:如果不再使⽤的sequence请删除。

SELECT * FROM DAYSBFJ.DAYS_CARD_UPDATE3 order by id asc--alter table DAYSBFJ.DAYS_CARD_UPDATE3 add source_Flag varchar2(2);--create sequence DAYS_CARD_UPDATE2_SEQ_ID minvalue 1 maxvalue 999999999 start with 1;--Update DAYSBFJ.DAYS_CARD_UPDATE2 set id = DAYS_CARD_UPDATE2_SEQ_ID.nextval;--update DAYSBFJ.DAYS_CARD_UPDATE3 set SOURCE_FLAG = '2'另⼀个例⼦:新建⼀个缺少主键的表create table test1(name1 varchar2(40),city varchar2(40));--插⼊数据insert into test1 values('name1','nanjing');insert into test1 values('name1','nanjing');insert into test1 values('name2','nanjing1');insert into test1 values('name3','nanjing2');insert into test1 values('name4','nanjing3');insert into test1 values('name5','nanjing4');insert into test1 values('name6','nanjing5');insert into test1 values('name7','nanjing6');insert into test1 values('name8','nanjing7');insert into test1 values('name9','nanjing8');insert into test1 values('name10','nanjing9');insert into test1 values('name10','nanjing9');insert into test1 values('name12','nanjing11');insert into test1 values('name13','nanjing12');insert into test1 values('name14','nanjing13'); commit;--增加主键IDalter table TEST1 add id number(10);--设置sequence使ID⾃增create sequence SEQ_IDminvalue 1maxvalue 999999999start with 1;--将id的值设置为sequenceUpdate test1 set id=seq_id.nextval; commit;--设置id为主键alter table TEST1add constraint PK_TEST1 primary key (ID); select ID,Name1,CITY from TEST1;。

在hibernate中实现oracle的主键自增策略

在hibernate中实现oracle的主键自增策略

在许多情形下,咱们使用Hibernate在曾经建立好数据库的根底上。

在oracle 中,假如曾经建立好的数据库中使用了sequence ,则能够遵照上面的步骤把它引入到Hibernate中:1、在oracle 首先创建sequencecreate sequence seq_idminvalue 1start with 1increment by 1cache 20;2.在你的hbm.xml中的配置<id column="ID0000" name="id" type="integer"><generator class="sequence"><param name="sequence">seq_id</param></generator></id>这样再拔出数据的时分,Hibernate回自动生成如下语句:hibernate : select seq_id.nextval from dualhibernate : insert into YXJK.T_YXJK_WHRYTXL (XM0000, ZW0000, LXDH00, SJHM00, DZYJ00,IP0000, ID0000) values (?, ?, ?, ?, ?, ?, ?)自动生成下一个序列值,而后将对象拔出表中。

在使用的时分需要注意,Hibernate对于sequence的主键的请求是必然要是shor,long,大约integer根据hibernate的文档,有两种方法实现实体对象的主键自动添加。

第一种:设置ID的添加策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就犹如MS-SQL,MY-SQL中的自动添加一样,不需要创建触发器,详细的oracle数据库脚本及hibernate配置文件如下:[1]oracle数据表的创建脚本:Java代码1. CREATE TABLE DEPARTMENT (2. ID NUMBER(19,0) DEFAULT '0' NOT NULL,3. NAME VARCHAR2(255) NOT NULL,4. DESCRIPTION CLOB5. );6. ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;7. ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);8.9. CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;复制代码创建DEPARTMENT表,并为DEPARTMENT表创建一个单独的SEQUENCE,名字为SEQUENCE_ID_SEQ,并不需要创建触发器。

在Hibernate中使用oracle的sequence产生主键

在Hibernate中使用oracle的sequence产生主键

在Hibernate中使用oracle的sequence产生主键一、 Hibernate介绍Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案。

ORM方案的思想是将对象模型表示的对象映射到关系型数据库中,或者反之。

Hibernate目前是ORM思想在Java中最成功、最强大的实现。

它于2001年的年末发布第一个版本,立即引起了广泛的注意。

2003年6月,Hibernate2发表,并且获得Jolt大奖,进而被JBoss吸纳成为它的一个子项目。

2005年3月,Hibernate 3发表,其中做了一些比较重大的改进。

本文以Hibernate3为基础编写。

另外,Hibernate除了可以在J2EE容器中运行外,还可以运行在Java应用程序中。

本文就是以Java应用程序为例来介绍它。

二、配置开发环境本文以一个Java应用程序(Java Application)为例,介绍如何使用Hibernate来进行数据库操作。

在进行Hibernate开发之前,需要首先获得Hibernate类库、相应数据库的JDBC驱动类库。

Hibernate类库可以从中下载,目前的版本是3.0。

而JDBC驱动可以根据不同的数据库来选择,在这个例子中,使用的是Oracle数据库,那么相应的JDBC驱动可以从Oracle安装目录\ora92\jdbc下获得。

其他的数据库请根据相关的说明获得。

下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:\hibernate-3.0,然后将C:\hibernate-3.0\下的hibernate.jar和C:\hibernate-3.0\lib下的那些第三方类库也放到环境变量CLASSPATH中。

(通常,只需要dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、antlr这些类库就可以了)做完这些配置后,就可以在此基础上进行基于Hibernate的Java程序开发了。

oralce 表结构自增长列 autoincrement

oralce 表结构自增长列 autoincrement

oralce表结构自增长列autoincrement在Oracle中,实现自增长列(Auto Increment)的功能通常使用序列(Sequence)和触发器(Trigger)。

Oracle没有像某些数据库(如MySQL)中的AUTO_INCREMENT 关键字来直接定义自增长列,但可以通过序列和触发器来实现类似的功能。

以下是使用序列和触发器在Oracle中创建自增长列的基本步骤:1.创建序列(Sequence):CREATE SEQUENCE your_sequence_nameSTART WITH 1INCREMENT BY 1NOMAXVALUE;这将创建一个名为your_sequence_name的序列,起始值为1,每次递增1。

2.创建表并使用触发器(Trigger)关联序列:CREATE TABLE your_table_name(id NUMBER PRIMARY KEY,other_columns...--其他列);CREATE OR REPLACE TRIGGER your_trigger_nameBEFORE INSERT ON your_table_nameFOR EACH ROWBEGINSELECT your_sequence_name.NEXTVAL INTO:new.id FROM dual;END;这里创建了一个名为your_table_name的表,其中id列被定义为主键,并且在表中创建了一个名为your_trigger_name的触发器。

该触发器会在每次插入新行之前触发,并使用序列your_sequence_name的NEXTVAL值为id列赋予新值。

通过以上步骤,在向表中插入数据时,id列将自动从序列中获取下一个值作为自增长的主键值。

简单三步轻松实现ORACLE字段自增

简单三步轻松实现ORACLE字段自增

简单三步轻松实现ORACLE字段⾃增第⼀步:创建⼀个表。

复制代码代码如下:create table Test_Table(ID number(11) primary key,Name varchar(50) not null,Value1 varchar(50) not null)第⼆步:创建⼀个⾃增序列以此提供调⽤函数。

复制代码代码如下:create sequence AutoIDstart with 1 //根据需要⾃⼰可修改该数值increment by 1 //步长值minvalue 1nomaxvalue其实到此步骤,已经可以实现字段⾃增了。

新增记录时看如下代码:复制代码代码如下:Insert into Test_Table(ID,Name,Value1)values(AutoID.nextval,'xiyang','blog')第三步:我们通过创建⼀个触发器,使调⽤的⽅式更加简单。

复制代码代码如下:create trigger AutoID_Triggerbefore insert on Test_Table for each rowbeginselect AutoID.nextval into :new.ID from dual;end AutoID_Trigger;该触发器在数据库注册了表格的侦听,即当指定表Test_Table插⼊记录之前,我们调⽤⼀个序列⽅法的nextval获得新值,插⼊⾃增字段。

在触发器中,我们调⽤了系统虚拟表dual,该表作为系统表的⼀部分,它内部只存储⼀条记录,我们可以通过该表获取与系统相关的⼀些信息或者进⾏⼀些简单的逻辑操作。

在该触发器中,我们使⽤了dual的⼀个经典⽤法,即获取定义序列的nextval⽅法。

通过上⾯三个步骤,我们就实现了⼀个表的字段⾃增,做插⼊操作时执⾏以下代码即可:Insert into Test_Table(Name,Value1) values('xiyang','blog')通过在数据库中查询结果集,会发现ID列是⾃增的。

oracle中如何设置自增主键

oracle中如何设置自增主键

首先,你要有一张表!CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME V ARCHAR(25),PHONE V ARCHAR(10),ADDRESS V ARCHAR(50));如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶!然后,你需要一个自定义的sequenceCREATE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXV ALUE -- 不设置最大值NOCYCLE -- 一直累加,不循环NOCACHE -- 不建缓冲区以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:CREATE TRIGGER "触发器名称" BEFOREINSERT ON example FOR EACH ROW WHEN (new.id is null)beginselect emp_sequence.nextval into: new.id from dual;end;打完收工!下面你就试试插入数据吧!INSERT INTO example(Name,phone,address) Values(''Cao'',''56498543'',''Heibei'');=============================================================ORACLE SEQUENCE的简单介绍(自增长字段)- -在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

Oracle创建表并设置主键自增

Oracle创建表并设置主键自增

Oracle数据库如何创建表并设置主键自增
首先我们使用oracle sql developer官方管理工具来新建表并色织主键自增,首先连接数据库想必不用多说。

创建表
在表那个文件夹上右键选择新建表
弹出如下图所示:
输入你想要的表名和列名并设置数据类型主键一定要设置NUMBER类型
设置主键
只要在主键那一行单件一下最前面的小方块就行,产生如何所示的效果即可:
主键的标识就是那个小钥匙。

设置主键自增
下面我们设置主键自增,选中主键所在那一行,找到下面的身份列单击(如图所示):
如下图所示看到类型点击下拉菜单选择列序列:
此时系统自动生成触发器和序列不用做任何修改点击确定那个么一个主键自增的表就已经成功的生成了。

测试
下面我们测试一下数据插入是否成功,这里我们直插入name列不插入主键看看主键是否能够自增。

Select一下发现主键确实自动生成并且自增了,如果不放心可以多加几条测试数据,这里我就不多加描述了。

轻松学会Hibernate处理OracleID自增

轻松学会Hibernate处理OracleID自增

1.商品标题:Hibernate处理Oracle ID自增2.本商品最适合那类职业人群:Hibernate处理Oracle中ID自增遇到错误的程序人员3.本商品可以解决他们什么问题:解决了Oracle运用在Hibernate中时ID自增问题4.商品内容:解决方法:一.1:uuid.hex: 采用128位的算法来生成一个32位字符串。

最通用的一种方式。

适用于所有数据库。

在*.hbm.xml中按如下设置。

<id unsaved-value="null"><generator /></id>2:指定参数的情况<hibernate-mapping><class table="CHILD"> //把java class对应到database table中<id unsaved-value="0">//主键描述<generator >//采用oracle的sequence技术自动自增主键<param >SEQ_CHILD</param></generator></id>SEQ_CHILD是你定义的序列名3:以下是Tracylau 所写:所有的<generator>的Class都是从net.sf.hibernate.id.IdentifierGenerator接口实现得到的,Class属性表示该generator是由哪种方式来生成的。

生成方式包括:increment:生成long, short或者int类型的主键,不能在cluster环境下使用。

适用于所有数据库identity:生成long, short或者int类型的主键。

适用于DB2, MySQL, MS SQL Server, Sybase and HypersonicSQLsequence :生成long, short或者int类型的主键。

两种oracle创建字段自增长的实现方式 电脑资料

两种oracle创建字段自增长的实现方式 电脑资料

两种oracle创建字段自增长的实现方式电脑资料作者:WhyWin 字体:[增加减小] 类型:转载这篇文章介绍了两种oracle创建字段自增长的实现方式,一是序列+触发器,二是序列+显示调用序列,需要的朋友可以参考下mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能,因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式。

解析:1)INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。

2)START WITH 定义序列的初始值(即产生的第一个值),默认为1。

3)MAXVALUE 定义序列生成器能产生的最大值。

选项NOMAXVALUE 是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

4)MINVALUE定义序列生成器能产生的最小值。

选项NOMAXVALUE 是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

5)CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。

CYCLE代表循环,NOCYCLE代表不循环。

如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。

如果不循环,达到限制值后,继续产生新值就会发生错误。

6)CACHE(缓冲)定义存放序列的内存块的大小,默认为20。

NOCACHE 表示不对序列进行内存缓冲。

对序列进行内存缓冲,可以改善序列的性能。

解决方式一、序列+触发器具体实现方式如下:第一步,创建sequence第二步,创建表第三步,建立触发器第四步,测试并确认向表中插入一条数据,查看id字段是否自动增长了,解决方式二、序列+显示调用序列一、创建sequence二、建表三、插入数据(显示调用序列的下一个值插入)四、查看附带:查看序列当前值和下一个值的查看方式总结通过触发器直接添加的方式比显示调用方便一下,我们不需要哪个字段要通过哪个序列还获取下一个值,而通过触发器进行执行的添加。

Hibernate 主键自动增长策略

Hibernate 主键自动增长策略

标识符属性生成策略与对象识别1、什么是标识符属性Hibernate中的标识符属性,也可以称为Hibernate主键,它赋予每个持久化对象独一无二的数值,以此区分不同的持久化对象。

在Hibernate的映射问津(*.hbm.xml)中,<id>元素定义了持久化类的标识符属性的名称、类型和与数据库表中字段的映射<id>元素的<generator>子元素则用来设置当前持久化类的标识符属性的生成策略2、标识符属性的生成策略1)increment生成策略原理:从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值配置代码:<id name="id"type="ng.Integer"><generator class="increment"></generator></id>好处:兼容性比较强,在任何数据库都可以使用。

2)identity生成策略原理:在MS SQL Server、MySQL和DB2等数据库中,都可以设置表中某一个字段的数值自动增长,而identity生成策略就是通过使用这种方式,为当前的记录获取主键值的同时为持久化对象赋予标识符属性值配置代码:<id name="id"type="ng.Integer"><generator class="identity"></generator></id>限制:必须是数据库支持字段的值自动增长,Oracle就不行3)sequence生成策略原理:在Oracle、DB2和PostgreSQL等数据库中创建一个序列(sequence),然后Hibernate 通过序列为当前的记录获取主键值,进而为持久化对象赋予标识符属性代码:<id name="id"type="ng.Integer"column="ID"><generator class="sequence"><param name="sequence">gb_seq</param></generator></id>4)hilo生成策略(高低位生成策略)原理:hilo生成策略采用一种成为高/低位(hi/lo)的高效算法,产生的标识符属性值为long、short、int以及他们封装类的类型代码:<id name="id"type="ng.Integer"column="ID"><generator class="hilo"><param name="table">hibernate_key</param><param name="column">next_hivalue</param></generator></id>解释说明:在hibernate使用中,需要现在数据库中建立这个表以及这个字段,并为这个字段设一个值5)seqhilo(序列高低位)生成策略原理:seqhilo生成策略使用的还是高/低位算法,产生的标识符属性值为long、short、int以及他们封装类的类型。

oracle的主键生成规则

oracle的主键生成规则

oracle的主键生成规则1建立sequence1、Create Sequence(注释:你需要有CREATE SEQUENCE或CREATE ANY SEQUENCE权限) CREATE SEQUENCE emp_sequenceINCREMENT BY 1 ——每次加几个START WITH 1 ——从1开始计数NOMAXVALUE ——不设置最大值NOCYCLE ——一直累加,不循环maxvalue 999999999 ---最大值minvalue 1 ---最小值cycle ---循环cache ---缓存CACHE 10;只要定义了emp_sequence,你就可以用使CURRVAL,NEXTVALCURRVAL=返回 sequence的当前值NEXTVAL=增加sequence的值,然后返回 sequence 值例:create sequence SEQ_ALLOC_CORP_BILLminvalue 0maxvalue 999999999999999999999999999start with 100000increment by 1cache 20;2主键生成策略如果新的系统,新建的oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库转换为oracle 的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和mysql之类带有自动增长的数据库。

在很多情况下,我们使用Hibernate在已经建立好数据库的基础上。

在oracle中,如果已经建立好的数据库中使用了sequence,则可以按照下面的步骤把它引入到Hibernate中:1、在oracle 首先创建sequencecreate sequence seq_idminvalue 1start with 1increment by 1cache 20;2.在你的hbm.xml中的配置seq_id。

Hibernate自定义简单主键生成

Hibernate自定义简单主键生成

Hibernate⾃定义简单主键⽣成Hibernate⾃定义主键⽣成当使⽤Hibernate定义pojo的时候,有时候需要⽣成⼀定规则的数据表主键,这时候我们可以采⽤⾃定义主键⽣成⽅式去⽣成主键。

例如:1、在pojo属性中定义数据表主键1 @Id2 @GeneratedValue(generator = "xmqId")3 @GenericGenerator(name = "xmqId", strategy = "com.xmq.core.XMQGenerator")4 @Column(name = "C_ID")5private String pk;2、创建主键⽣成器1package com.xmq.core;23import java.io.Serializable;45import org.hibernate.engine.spi.SessionImplementor;6import org.hibernate.id.UUIDHexGenerator;78public class XMQGenerator extends UUIDHexGenerator {910public XMQGenerator () {11super();12 }1314 @Override15public Serializable generate(SessionImplementor session, Object obj) {16return "PK_" + super.generate(session, obj);17 }181920 }注意:在pojo的⽗类中有时候带有@MappedSuperclass注解,这表⽰这个⽗类不是⼀个完整的实体类,也不会映射到数据库表,但是他的属性都将映射到其⼦类的数据表字段中。

数据库ID自增

数据库ID自增

数据库ID⾃增hibernate利⽤mysql的⾃增长id属性实现⾃增长id和⼿动赋值id并存 我们知道在中如果设置了表id为⾃增长属性的话,insert语句中如果对id赋值(值没有被⽤到过)了,则插⼊的数据的id会为⽤户设置的值,并且该表的id的最⼤值会重新计算,以插⼊后表的id最⼤值为⾃增值起点 但是如果使⽤,也想实现这个的特性的话,怎么做呢? ⾸先我们看下hibernate的id⽣成策略:  hibernate⽂档写道 1、⾃动增长identity适⽤于MySQL、DB2、MS SQL Server,采⽤⽣成的主键,⽤于为long、short、int类型⽣成唯⼀标识使⽤SQL Server 和 MySQL 的⾃增字段,这个⽅法不能放到中,不⽀持⾃增字段,要设定sequence(MySQL 和 SQL Server 中很常⽤)数据库中的语法如下:MySQL:create table t_user(id int auto_increment primary key, name varchar(20));SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));< id name="id" column="id" type="long">< generator class="identity" />< /id>2、sequenceDB2、Oracle均⽀持的序列,⽤于为long、short或int⽣成唯⼀标识数据库中的语法如下:Oracle:create sequence seq_name increment by 1 start with 1;需要主键值时可以调⽤seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这个sequence序列,保证每次取到的值唯⼀,如:insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);< id name="id" column="id" type="long">< generator class="sequence">< param name="sequence">seq_name</param>< /generator>< /id>如果我们没有指定sequence参数,则Hibernate会访问⼀个默认的sequence,是hibernate_sequence,我们也需要在数据库中建⽴这个sequence此外,sequence还可以有另外⼀个参数是paramters,可以查看Hibernate的API了解它的⽤法,见org.hibernate.id.SequenceGenerator调⽤数据库的sequence来⽣成主键,要设定序列名,不然hibernate⽆法找到:< param name="sequence">NAME_SEQ</param>(Oracle中很常⽤)3、hilo使⽤⼀个⾼/低位⽣成的long、short或int类型的标识符,给定⼀个表和字段作为⾼位值的来源,默认的表是hibernate_unique_key,默认的字段是next_hi。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

# </hibernate-mapping>
复制代码
在hibernate映射文件中,对ID的生成策略选择sequence,指定sequence的名字DEPARTMENT_ID_SEQ就可以了,当你保存新对象的时候,hibernate会自动取得DEPARTMENT_ID_SEQ.NEXTVAL作为新对象的ID保存到数据库,所以不需要再使用触发器再来生成新记录的ID。
hibernate映射文件的配置
Java代码
# <?xml version="1.0"?>
# <!DOCTYPE hibernate-mapping PUBLIC
# "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
IP0000, ID0000) values (?, ?, ?, ?, ?, ?, ?)
自动生成下一个序列值,然后将对象插入表中。
在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shor,long,或者integer
根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
# <id name="id" column="ID">
# <generator class="sequence">
# <param name="sequence">DEPARTMENT_ID_SEQ</param>
# </generator>
在很多情况下,我们使用Hibernate在已经建立好数据库的基础上。在oracle中,如果已经建立好的数据库中使用了sequence ,则可以按照下面的步骤把它引入到Hibernate中
1、在oracle 首先创建sequence
create sequence seq_id
minvalue 1
8.
9. CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
复制代码
创建DEPARTMENT表,并为DEPARTMENT表创建一个单独的SEQUENCE,名字为SEQUENCE_ID_SEQ,并不需要创建触发器。
第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件如下
[1]oracle数据表的创建脚本
</generator>
</id>
这样再插入数据的时候,Hibernate回自动生成如下语句
hibernate : select seq_id.nextval from dual
hibernate : insert into YXJK.T_YXJK_WHRYTXL (XM0000, ZW0000, LXDH00, SJHM00, DZYJ00,
# </id>
# <property name="name" column="NAME" type="string" />
# <property name="description" column="DESCRIPTION" type="text" />
# </class>
start with 1
ment by 1
cache 20;
2.在你的hbm.xml中的配置
<id column="ID0000" name="id" type="integer">
<generator class="sequence">
<param name="sequence">seq_id</param>
Java代码
CREATE TABLE DEPARTMENT (
2. ID NUMBER(19,0) DEFAULT ‘0‘ NOT NULL,
3. NAME VARCHAR2(255) NOT NULL,
4. DESCRIPTION CLOB
5. );
# "/hibernate-mapping-3.0.dtd">
# <hibernate-mapping package="com.liyanframework.demo.domain">
# <class name="Department" table="DEPARTMENT">
6. ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;
7. ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);
相关文档
最新文档