Oracle自增序列在Hibernate中的配置方法

在很多情况下,我们使用Hibernate在已经建立好数据库的基础上。在oracle中,如果已经建立好的数据库中使用了sequence,则可以按照下面的步骤把它引入到Hibernate中:        1、在oracle 首先创建sequence

CREATE SEQUENCE SEQ_ID

INCREMENT BY 1

START WITH 1

NOMINVALUE

NOMAXVALUE

NOCYCLE

NOCACHE

NOORDER;

2、在你的hbm.xml中的配置

seq_id

这样再插入数据的时候,Hibernate回自动生成如下语句:

hibernate: select seq_id.nextval from dual

hibernate: 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数据表的创建脚本:

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映射文件的配置:

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

DEPARTMENT_ID_SEQ

在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 ON STAFF(STATUS);

CREATE SEQUENCE HIBERNATE_SEQUENCE

INCREMENT BY 1

MINVALUE 90000

MAXVALUE 999999999999999999999999

NOCYCLE;

CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF FOR EACH ROW

BEGIN

IF INSERTING AND :NEW.ID IS NULL THEN

SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL;

END IF;

END;

创建STAFF表,但是并没有为STAFF创建相应的主键sequence,而是创建了一个名字为HIBERNATE_SEQUENCE的 sequence,然后创建一个触发器STAFF_ID_TRG,当执行INSERT操作时,hibernate会先执行一次 HIBERNATE_SEQUENCE.NEXTVAL,所以在触发器中只需要取得HIBERNATE_SEQUENCE.CURRVAL作为新记录的 ID。

[2]hibernate映射文件的配置:

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

在hibernate映射文件中,对ID的生成策略选择native,hibernate会根据你数据库的触发器来生成新记录的ID。

比较两种做法,第二种做法也就是hibernate在代码中,实现了oracle中的触发器功能。对于不同的情况,选择不懂的做法。如果新的系统,新建的oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库转换为oracle 的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和mysql之类带有自动增长的数据库。

怎样给oracle表设置序列,Oracle的sequence序列在hibernate中的配置方法相关推荐

  1. oracle 表建模工具,Oracle数据库建模工具(ModelRight for Oracle)下载 V4.0 官方版 - 比克尔下载...

    ModelRight for Oracle是一款Oracle数据库建工具,有了它你就不用在敲那么多的命令了,只需要点几下鼠标就可以创建出一个数据库模型,然后根据模型来制作数据库,不仅简单,也不容易出错 ...

  2. oracle表关联词语,Oracle的同义词(synonyms)详解

    Oracle的同义词(synonyms)详解 从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系. 同义词语法:CREATE [PUBLIC] SYNONYM synonym FOR ob ...

  3. oracle表空间 unifor,Oracle 表空间的监控

    现在所有业务系统上面都部署了各种类型针对各方面的监控,那么咱们Oracle也不例外,也需要做关于oracle方面的监控,比如实例的存活状况,监听器的存活状况,系统的运行情况(包括,磁盘使用率,进程数, ...

  4. oracle表的管理,Oracle表的管理

    数据类型: 字符型 char 定长的,最大2000字符 varchar 变长的,最大4000字符 clob(character large object)字符型大对象,最大4G 数字类型 number ...

  5. oracle 表空间转换,Oracle表空间数据文件移动的方法

    实现把用户表空间中的数据文件从某一个路径移动到另一个路径 一.针对可offline的非系统表空间 本例移动oracle的案例表空间(EXAMPLE表空间),将其从 D:\ORADATA\ORCL\ 移 ...

  6. oracle表启用online,Oracle数据库启动与关闭

    C:\app\Administrator\virtual\product\12.2.0\dbhome_2\bin>dir oracle.exe 驱动器 C 中的卷没有标签. 卷的序列号是 7E6 ...

  7. oracle表还原truncate,Oracle数据库之Oracle表恢复(truncate)

    本文主要向大家介绍了Oracle数据库之Oracle表恢复(truncate),通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 一.模拟truncate操作: SQL> c ...

  8. oracle 表访问,向oracle导入访问表

    我在将表导入到oracle时遇到问题.当我导入一个字段是例如导入: 在访问我已经'20,200' 和进口到Oracle''中访问和导入oracle作为'12535'向oracle导入访问表 在访问20 ...

  9. oracle 表空间 归档,oracle数据库表空间及归档

    --表空间(TableSpace)是Oracle的开创性理念.表空间使得数据库管理更加灵活,而且极大地提高了数据库性能. --作用 :1.避免磁盘空间突然耗竭的风险 2.规划数据更灵活 3.提高数据库 ...

最新文章

  1. python3-pwntools教程_python的pwntools工具的日常使用
  2. android ui动画效果怎么做,AndroidUI 布局动画-为列表添加布局动画效果
  3. Redis Pub/Sub (Java)
  4. 使用敏捷回顾实施组织变革
  5. 如何使用 Docker 部署一个基于 Play Framework 的 Scala Web 应用?
  6. java中和char功能相反的是_JAVA基础语法
  7. MS SQL Server 常用操作
  8. oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT
  9. 目录浏览器对话框控件 c# 1614822374
  10. Mac OS修改VSCode Go的默认缩进格式
  11. Java多线程:线程池
  12. 中国移动咪咕公司:打造五新体验 做5G时代内容的聚合者与生产者
  13. 关于纯流量卡-物联网卡的一点个人看法
  14. php ucenter home登录,UCenter Home
  15. html5播放器视频倍速播放功能
  16. redis数据结构hash
  17. 可视化实验八:利用Python绘制柱状图、条形图
  18. 笔记神器-Obsidian快速使用入门教程
  19. 一个等号= 二个等号== 三个等号=== 的区别
  20. 员工怎样跟老板谈加薪 7个技巧让你成功加薪

热门文章

  1. Springboot利用poi导出excel下载
  2. HTML5 Canvas 绘图
  3. ios 内存管理的理解(五)ARC使用特点及注意事项
  4. JavaScript 中的string 方法
  5. Laravel 日志权限问题
  6. 【bzoj2084】[Poi2010]Antisymmetry
  7. 谈谈Groovy闭包
  8. Mybatis 一对多 简单映射配置
  9. Python基础——6面向对象编程
  10. Android ListView的基本应用