hibernate映射oracle 序列自增长

本文由wlg2011贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
hibernate 映射 oracle 自增长 修改浏览权限 | 删除 根据 hibernate 的文档,有两种方式实现实体对象的主键自动增长。
第一种:设置 ID 的增长策略是 sequence,同时指定 sequence 的名字,最好每个表建一个 sequence,此种做法就如同 MS-SQL,MY-SQL 中的自动增长一样,不需要创建触发器,具体的 oracle 数据库脚本及 hibernate 配置文件如下:
[1]oracle 数据表的创建脚本:
CREATE TABLE DEPARTMENT
( ID NUMBER(19,0) DEFAULT '0' NOT NULL, NAME VARCHAR2(255) NOT NULL, DESCRIPTION CLOB );
ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;
ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);
CREATE SEQUENCE
DEPARTMENT_ID_SEQ MINVALUE 10000
MAXVALUE 999999999999999999999999
INCREMENT BY 1
NOCYCLE;
CREATE TABLE DEPARTMENT
( ID NUMBER(19,0) DEFAULT '0' NOT NULL, NAME VARCHAR2(255) NOT NULL, DESCRIPTION CLOB );
ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;
ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);
CREATE SEQUENCE
DEPARTMENT_ID_SEQ MINVALUE 10000
MAXVALUE 999999999999999999999999
INCREMENT BY 1
NOCYCLE;
创建 DEPARTMENT 表,并为 DEPARTMENT 表创建一个单独的 SEQUENCE,名字为 SEQUENCE_ID_SEQ,并不需要创建触发器。
[2]hibernate 映射文件的配置:
Java 代码
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liyanframework.demo.domain"> <class name="Department" table="DEPARTMENT">
<generator class="sequence">
DEPARTMENT_ID_SEQ </generator>
</class> </hibernate-mapping>
在 hibernate 映射文件中,对 ID 的生成策略选择 sequence,指定 sequence 的名字 DEPARTMENT_ID_SEQ 就可以了,当你保存新对象的时候,hibernate 会自动取得 DEPARTMENT_ID_SEQ.NEXTVAL 作为新对象的 ID 保存到数据库,所以不需要再使用触 发器再来生成新记录的 ID。
第二种:设置 ID 的增长策略是 native,但是需要创建一个名字为 hibernate_sequence(这 个名字好像是 hibernate 默认的 sequence 名字, 不创建会出错的) 的全局使用的 sequence, 然后再对每一个表的 ID 生成的时候,使用触发器,取得 hibernate_sequence.CURRVAL 作为新记录的 ID,具体的 oracle 数据库脚本及 hibernate 配置文件如下:
[1]oracle 数据表的创建脚本:
CREATE TABLE STAFF ( ID NUMBER(19,0) DEFAULT '0' NOT NULL, NAME VARCHAR2(255) NOT NULL, AGE NUMBER(3,0) NOT NULL, BIRTHDAY DATE NOT NULL, SALARY NUMBER(10,2) NOT NULL, LEVELNESS FLOAT NOT NULL, CREATETIME TIMESTAMP NOT NULL, ENABLE CHAR(2) DEFAULT 'Y' NOT NULL, STATUS VARCHAR2(64) NOT NULL, DEPARTMENT_ID NUMBER(19,0) ); ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE;
ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE;
ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME); CREATE INDEX IDX_STAFF_STATUS _disibledevent=>
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liyanframework.demo.domain"> <class name="Staff" table="STAFF"> <generator class="native" />
<many-to-one name="department" column="DEPARTMENT_ID" class="Department" /> </class> </hibernate-mapping>
在 hibernate 映射文件中,对 ID 的生成策略选择 native,hibernate 会根据你数据库的触发 器来生成新记录的 ID。[/list] 比较两种做法,第二种做法也就是 hibernate 在代码中,实现了 oracle 中的触发器功能。对 于不同的情况,选择不懂的做法。如果新的系统,新建的 oracle 数据库,推荐使用第一种 做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库 转换为 oracle 的, 那就要用第二种了, 使用 native 的方式, 可以不改动配置文件, 兼容 oracle 和 mysql 之类带有自动增长的数据库。
------------------------本TXT由“文库宝”下载:http://www.mozhua.net/wenkubao-----------------------------------------------------
======================================================================================================
-------------------------------------------------------本文章内容来源于互联网 仅作交流使用---------------------------------------------
Tags: 

延伸阅读

最新评论

发表评论