Hibernate在oracle中ID增长的方式(续)
引用链接:http://blog.csdn.net/w183705952/article/details/7367272
第二种:设置ID的增长策略是native,但是需要创建一个名字为hibernate_sequence(这个名字好像是hibernate默认的sequence名字,不创建会出错的)的全局使用的sequence,然后再对每一个表的ID生成的时候,使用触发器,取得hibernate_sequence.CURRVAL作为新记录的ID,具体的oracle数据库脚本及hibernate配置文件如下:
[1]oracle数据表的创建脚本:
Java代码
|
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 MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 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映射文件的配置:
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="Staff" table="STAFF"> <id name="id" column="ID"> <generator class="native" /> </id> <property name="name" column="NAME" type="string" /> <property name="age" column="AGE" type="integer" /> <property name="birthday" column="BIRTHDAY" type="date" /> <property name="salary" column="SALARY" type="big_decimal" /> <property name="level" column="LEVELNESS" type="float" /> <property name="createTime" column="CREATETIME" type="timestamp" /> <property name="enable" column="ENABLE" type="character" /> <property name="status" column="STATUS" type="string" /> <many-to-one name="department" column="DEPARTMENT_ID" class="Department" /> </class> </hibernate-mapping> |
在hibernate映射文件中,对ID的生成策略选择native,hibernate会根据你数据库的触发器来生成新记录的ID。
PS:比较两种做法,第二种做法也就是hibernate在代码中,实现了oracle中的触发器功能。对于不同的情况,选择不懂的做法。如果新的系统,新建的oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库转换为oracle的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和MySQL之类带有自动增长的数据库。
Hibernate在oracle中ID增长的方式(续)的更多相关文章
- Hibernate在oracle中ID增长的方式
引用链接:http://blog.csdn.net/w183705952/article/details/7367272 Hibernate在oracle中ID增长的方式 第一种:设置ID的增长策略是 ...
- hibernate解决oracle的id自增?
以前做SSH项目时,涉及到的数据库是mySQL,只需将bean的配置文件id设为native 就可以实现表id的自增. 现在用到了Oracle,当然知道这样是不行的啦,那么用序列自增? 我在网络上搜索 ...
- oracle中怎么用normal方式登录怎么自定义用户名和密码
1.首先要创建一个用户.必须使用有最高权限的用户来创建,语句如下: create user shopping identified by 123456;--创建shopping用户,密码123456 ...
- hibernate在Oracle中插入数据,默认字段被设置为null的问题解决
参考内容: http://blog.sina.cn/dpool/blog/s/blog_90629d5301014a5w.html 在数据库中一个字段的默认值为1,但是在插入数据后,本来该字段为空,值 ...
- hibernate(四)ID生成策略
一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...
- 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...
- Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长: 通过Hibernate注解的方式映射oracel数据库的sequence主键生成器 ...
- 利用hibernate实现oracle(每张表的ID)自动增长
设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence 例如创建一个序列:CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVA ...
随机推荐
- Leetcode(869)-重新排序得到 2 的幂
从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零. 如果我们可以通过上述方式得到 2 的幂,返回 true:否则,返回 false. 示例 1: 输入:1 输出 ...
- HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解
题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...
- Gym 101480F Frightful Formula(待定系数)题解
#include<cmath> #include<set> #include<map> #include<queue> #include<cstd ...
- 如何将 js 同步方法转换成异步方法
如何将 js 同步方法转换成异步方法 // promise export const getUserToken = () => new Promise((resolve, reject) =&g ...
- .pyc & Python
.pyc & Python Python bytecode / 字节码 Python compiles the .py files and saves it as .pyc files , s ...
- CSS3 & Grid Layout All In One
CSS3 & Grid Layout All In One W3C https://www.w3.org/TR/css-grid-1/ Grid Layout is a new layout ...
- Azure 信用卡扣款 1 美元 & Azure 中国客服
Azure 信用卡扣款 1 美元 & azure 中国客服 Azure 免费帐户常见问题 https://azure.microsoft.com/zh-cn/free/free-account ...
- Service Worker in Action
Service Worker in Action https://caniuse.com/#feat=serviceworkers Service Workers 1 W3C Candidate Re ...
- linux move file / folder bash command
linux move file / folder bash command mv $ which mv $ man mv # mv [-f] source target/ target folder ...
- c++ win32 关机 注销 重启
#include <iostream> #include <Windows.h> #pragma comment(lib, "user32.lib") #p ...