- 浏览: 226634 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
浪迹随风:
文章是挺好的,不过太杂了。。。信息量也很大。。。很难消化。。。 ...
EJB 介绍 -
javaersu:
yds3300376yd 写道学习了,只是楼主写的有点杂,现在 ...
EJB 介绍 -
yds3300376yd:
学习了,只是楼主写的有点杂,现在还看不太懂,刚学习EJB,我觉 ...
EJB 介绍 -
javaersu:
不错,这里也有一篇类似的EJB文章教程http://www.y ...
EJB 介绍 -
dingding5060:
brother , 你贴代码想说明什么???
enum
在Hibernate中实现Oracle的自动增长
根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件如下:
[1]oracle数据表的创建脚本:
1. CREATE TABLE DEPARTMENT (
2. ID NUMBER(19,0) DEFAULT '0' NOT NULL,
3. NAME VARCHAR2(255) NOT NULL,
4. DESCRIPTION CLOB
5. );
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,并不需要创建触发器。
[2]hibernate映射文件的配置:
10. < ?xml version="1.0"?>
11. < !DOCTYPE hibernate-mapping PUBLIC
12. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
13. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
14. < hibernate-mapping package="com.liyanframework.demo.domain">
15. < class name="Department" table="DEPARTMENT">
16. < id name="id" column="ID">
17. < generator class="sequence">
18. < param name="sequence">DEPARTMENT_ID_SEQ< /param>
19. < /generator>
20. < /id>
21. < property name="name" column="NAME" type="string" />
22. < property name="description" column="DESCRIPTION" type="text" />
23. < /class>
24. < /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数据表的创建脚本:
25. CREATE TABLE STAFF (
26. ID NUMBER(19,0) DEFAULT '0' NOT NULL,
27. NAME VARCHAR2(255) NOT NULL,
28. AGE NUMBER(3,0) NOT NULL,
29. BIRTHDAY DATE NOT NULL,
30. SALARY NUMBER(10,2) NOT NULL,
31. LEVELNESS FLOAT NOT NULL,
32. CREATETIME TIMESTAMP NOT NULL,
33. ENABLE CHAR(2) DEFAULT 'Y' NOT NULL,
34. STATUS VARCHAR2(64) NOT NULL,
35. DEPARTMENT_ID NUMBER(19,0)
36. );
37. ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE;
38. ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE;
39. ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME);
40. CREATE INDEX IDX_STAFF_STATUS ON STAFF(STATUS);
41.
42. CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
43.
44. CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF
45. FOR EACH ROW
46. BEGIN
47. IF INSERTING AND :NEW.ID IS NULL THEN
48. SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL;
49. END IF;
50. END;
创建STAFF表,但是并没有为STAFF创建相应的主键sequence,而是创建了一个名字为HIBERNATE_SEQUENCE的 sequence,然后创建一个触发器STAFF_ID_TRG,当执行INSERT操作时,hibernate会先执行一次 HIBERNATE_SEQUENCE.NEXTVAL,所以在触发器中只需要取得HIBERNATE_SEQUENCE.CURRVAL作为新记录的 ID。
[2]hibernate映射文件的配置:
51. < ?xml version="1.0"?>
52. < !DOCTYPE hibernate-mapping PUBLIC
53. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
54. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
55. < hibernate-mapping package="com.liyanframework.demo.domain">
56. < class name="Staff" table="STAFF">
57. < id name="id" column="ID">
58. < generator class="native" />
59. < /id>
60. < property name="name" column="NAME" type="string" />
61. < property name="age" column="AGE" type="integer" />
62. < property name="birthday" column="BIRTHDAY" type="date" />
63. < property name="salary" column="SALARY" type="big_decimal" />
64. < property name="level" column="LEVELNESS" type="float" />
65. < property name="createTime" column="CREATETIME" type="timestamp" />
66. < property name="enable" column="ENABLE" type="character" />
67. < property name="status" column="STATUS" type="string" />
68. < many-to-one name="department" column="DEPARTMENT_ID" class="Department" />
69. < /class>
70. < /hibernate-mapping>
在hibernate映射文件中,对ID的生成策略选择native,hibernate会根据你数据库的触发器来生成新记录的ID。
比较两种做法,第二种做法也就是hibernate在代码中,实现了oracle中的触发器功能。对于不同的情况,选择不懂的做法。如果新的系统,新建的 oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库转换为oracle的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和mysql之类带有自动增长的数据库。
安装有oracle数据库,创建数据库,总是要创建一个主键ID,唯一标示各条记录,但oracle不支持自动编号,所以还得创建一个SEQUENCE(序列)语句如
create sequence bign nocycle maxvalue 9999999999 start with1;//增加数据
insertintotable (ID,..) values(bign.nextval,..)
在hibernate中的映射文件可这么写
71. < id name="id" type="java.lang.Long" column="ID">
72. < generator class="sequence">
73. < param name="sequence">bign< /param>
74. < /generator>
75. < /id>
或
76. < id name="id" type="java.lang.Long" column="ID">
77. < generator class="increment">
78. < /id>
(increment 用与为long,short或者int类型生成唯一标示。只有在没有其他进程忘同一张表中插入数据时才能使用。在集群下不要使用)
根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件如下:
[1]oracle数据表的创建脚本:
1. CREATE TABLE DEPARTMENT (
2. ID NUMBER(19,0) DEFAULT '0' NOT NULL,
3. NAME VARCHAR2(255) NOT NULL,
4. DESCRIPTION CLOB
5. );
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,并不需要创建触发器。
[2]hibernate映射文件的配置:
10. < ?xml version="1.0"?>
11. < !DOCTYPE hibernate-mapping PUBLIC
12. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
13. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
14. < hibernate-mapping package="com.liyanframework.demo.domain">
15. < class name="Department" table="DEPARTMENT">
16. < id name="id" column="ID">
17. < generator class="sequence">
18. < param name="sequence">DEPARTMENT_ID_SEQ< /param>
19. < /generator>
20. < /id>
21. < property name="name" column="NAME" type="string" />
22. < property name="description" column="DESCRIPTION" type="text" />
23. < /class>
24. < /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数据表的创建脚本:
25. CREATE TABLE STAFF (
26. ID NUMBER(19,0) DEFAULT '0' NOT NULL,
27. NAME VARCHAR2(255) NOT NULL,
28. AGE NUMBER(3,0) NOT NULL,
29. BIRTHDAY DATE NOT NULL,
30. SALARY NUMBER(10,2) NOT NULL,
31. LEVELNESS FLOAT NOT NULL,
32. CREATETIME TIMESTAMP NOT NULL,
33. ENABLE CHAR(2) DEFAULT 'Y' NOT NULL,
34. STATUS VARCHAR2(64) NOT NULL,
35. DEPARTMENT_ID NUMBER(19,0)
36. );
37. ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE;
38. ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE;
39. ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME);
40. CREATE INDEX IDX_STAFF_STATUS ON STAFF(STATUS);
41.
42. CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
43.
44. CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF
45. FOR EACH ROW
46. BEGIN
47. IF INSERTING AND :NEW.ID IS NULL THEN
48. SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL;
49. END IF;
50. END;
创建STAFF表,但是并没有为STAFF创建相应的主键sequence,而是创建了一个名字为HIBERNATE_SEQUENCE的 sequence,然后创建一个触发器STAFF_ID_TRG,当执行INSERT操作时,hibernate会先执行一次 HIBERNATE_SEQUENCE.NEXTVAL,所以在触发器中只需要取得HIBERNATE_SEQUENCE.CURRVAL作为新记录的 ID。
[2]hibernate映射文件的配置:
51. < ?xml version="1.0"?>
52. < !DOCTYPE hibernate-mapping PUBLIC
53. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
54. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
55. < hibernate-mapping package="com.liyanframework.demo.domain">
56. < class name="Staff" table="STAFF">
57. < id name="id" column="ID">
58. < generator class="native" />
59. < /id>
60. < property name="name" column="NAME" type="string" />
61. < property name="age" column="AGE" type="integer" />
62. < property name="birthday" column="BIRTHDAY" type="date" />
63. < property name="salary" column="SALARY" type="big_decimal" />
64. < property name="level" column="LEVELNESS" type="float" />
65. < property name="createTime" column="CREATETIME" type="timestamp" />
66. < property name="enable" column="ENABLE" type="character" />
67. < property name="status" column="STATUS" type="string" />
68. < many-to-one name="department" column="DEPARTMENT_ID" class="Department" />
69. < /class>
70. < /hibernate-mapping>
在hibernate映射文件中,对ID的生成策略选择native,hibernate会根据你数据库的触发器来生成新记录的ID。
比较两种做法,第二种做法也就是hibernate在代码中,实现了oracle中的触发器功能。对于不同的情况,选择不懂的做法。如果新的系统,新建的 oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库转换为oracle的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和mysql之类带有自动增长的数据库。
安装有oracle数据库,创建数据库,总是要创建一个主键ID,唯一标示各条记录,但oracle不支持自动编号,所以还得创建一个SEQUENCE(序列)语句如
create sequence bign nocycle maxvalue 9999999999 start with1;//增加数据
insertintotable (ID,..) values(bign.nextval,..)
在hibernate中的映射文件可这么写
71. < id name="id" type="java.lang.Long" column="ID">
72. < generator class="sequence">
73. < param name="sequence">bign< /param>
74. < /generator>
75. < /id>
或
76. < id name="id" type="java.lang.Long" column="ID">
77. < generator class="increment">
78. < /id>
(increment 用与为long,short或者int类型生成唯一标示。只有在没有其他进程忘同一张表中插入数据时才能使用。在集群下不要使用)
- 在Hibernate中实现Oracle的自动增长.part01.rar (5.7 KB)
- 下载次数: 0
- 在Hibernate中实现Oracle的自动增长.part02.rar (2.6 KB)
- 下载次数: 0
发表评论
-
快速排序算法的java实现
2013-08-08 12:25 2101快速排序思想: 一趟快速排序是: 1,随机产 ... -
java.util.Timer
2013-07-06 17:04 10701。Timer是用来干什么用 ... -
获取Java项目根目录
2013-07-03 19:50 1443获取Java项目根目录 <pre id=&qu ... -
如何使用java synchronized进行线程同步
2012-05-15 01:02 977这篇文章从网上找到的,作者是谁不详,因为到处都是转帖。看了之后 ... -
Java中的IO流知识总结
2011-05-13 00:26 1047总结一: Java IO的一般使用原则: 一、按数据来 ... -
Log4j 包动态加载
2011-05-12 16:24 1267Log4j的包下载完成后,解压,将其中打包好的的log4j ... -
java中堆和栈区别
2011-04-28 22:32 904stack 和 heap 都是内存的 ... -
java使用相对路径读取xml文件
2011-01-19 14:41 2017一、xml文件一般的存放位置有三个: 1.放在WEB-INF下 ... -
深入研究java.lang.ThreadLocal类
2011-01-12 01:01 788一、概述 ThreadLocal是 ... -
使用说明文档\
2010-12-18 17:56 41使用说明文档 -
JAVA常用定位方法
2010-12-02 15:11 29用ps -eLf | grep java | wc 查看系统里 ... -
MyEclipse优化为工作减轻负担
2010-12-02 15:11 1031MyEclipse优化为工作减轻负担,MyEclipse优化呢 ... -
数据库编程规范
2010-10-19 08:11 877数据库编程规范 -
编码规范1
2010-10-19 08:00 36编码规范1编码规范1 -
JAVA
2010-10-19 01:12 956JAVAJAVAJAVAJAVA -
oscache实现二级缓存简介
2010-10-13 15:07 1226OSCache是当前运用最广的缓存方案,JBoss,Hiber ... -
JAVA虚拟机性能参数调优
2010-10-11 15:42 1083JAVA虚拟机性能参数调优 -
Java内存泄漏的定位和解决
2010-10-11 15:33 1163问题描述 解决方法概述 Optimizeit安装包获取方法 O ... -
利用jvmstat进行jvm性能监视
2010-10-08 23:44 2046最近需要在 Linux 系统上 ... -
浅谈设置JVM内存分配的几个妙招
2010-10-08 23:26 1274一、设置JVM内存设置 1. ...
相关推荐
本文将深入探讨如何在Hibernate中实现Oracle数据库的自动增长特性,这一功能对于确保数据表中的主键唯一性至关重要。 ### Oracle数据库的自动增长机制 Oracle数据库提供了强大的序列(sequence)功能来支持自动增长...
综上所述,Hibernate提供了丰富的主键生成策略,涵盖了从简单的自动增长到复杂的分布式唯一ID生成。开发者应根据具体的应用需求和数据库特性,选择最合适的主键生成策略,以确保系统的稳定性和性能。无论是追求高...
- **序列创建**:由于Oracle数据库不支持字段自动增长特性,需创建序列`student_sequence`来实现自动增长功能。 ```sql CREATE SEQUENCE student_sequence INCREMENT BY 1 START WITH 1000 NOMAXVALUE NOCYCLE...
1. 设计数据库表:在 Oracle 数据库中,创建名为 Student 的表,包含三个字段:Student_ID(主键,整型,自动增长)、Student_Name(学员姓名,字符串类型)和 Student_Age(学员年龄,整型)。由于 Oracle 没有内置...
在Oracle数据库环境下,当需要为表创建自动增长的主键时,通常会使用Oracle的sequence机制。本文将详细介绍如何在Hibernate中使用Oracle sequence,以及在使用过程中应注意的一些事项。 首先,我们来看如何为不同的...
默认情况下,Hibernate可能会选择自动增长策略,但根据实际需求,可能需要使用`assigned`策略,即主键由应用逻辑生成,例如使用序列或自定义ID生成器。修改后的配置如下: ```xml ``` 这段配置表示主键...
* Identity:支持主键自动增长 * Uuid:持久化类中的属性必须是 String 类型 * Native:Hibernate 会根据数据库的不同,选择合适的主键的生成策略 Sequence * 是 oracle 内部特有的内容,相当于 uuid,所以是字符...
在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...
JPA提供了多种策略,如 AUTO(让数据库自动生成,例如自增ID)、TABLE(通过特定的数据库表生成)、IDENTITY(数据库自动生成,比如MySQL的自动增长)、SEQUENCE(基于数据库序列,适用于Oracle等支持序列的数据库)...
这种方式更为常见,因为它避免了由于业务逻辑变化导致的主键更改问题,并且易于实现自动增长以确保唯一性。 #### 三、Hibernate主键生成策略详解 Hibernate提供了多种主键生成策略,以适应不同的应用场景和数据库...
6. Hibernate提供了多种主键生成策略,如identity(由数据库自动增长,非所有数据库支持)、sequence(Oracle序列)、native(根据配置的方言自动选择策略)和assigned(手动分配ID)。 7. Hibernate中,对象的状态...
@GeneratedValue注解则定义了主键的生成策略,比如自动增长、序列等。例如,对于Oracle数据库,我们可以使用@SequenceGenerator和@GeneratedValue来获取sequence生成的主键。 @Column注解则用来标记实体Bean中的...
4. **Identity**:依赖于底层数据库支持的自动增长特性,如MySQL的`AUTO_INCREMENT`。这种方式易于使用,但可能会影响程序的跨数据库移植性。 5. **Sequence**:针对支持序列的数据库,例如Oracle。这种方式能够...
在Hibernate中,主键的生成可以通过编程方式、数据库内置机制或者特定的生成器来实现。接下来我们将逐一探讨这些策略: 1. **Identity策略**: 这种策略适用于支持自动增长主键的数据库,如MySQL的`AUTO_INCREMENT...
- 需要在Hibernate配置文件中正确配置Oracle数据库相关的属性,如连接字符串、驱动类、方言等: ```xml <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect <property name="hibernate...
Oracle可能需要sequence,而MySQL通常使用自动增长的主键。 9. **表字段类型映射**:在反向工程过程中,可以调整Java类型以匹配数据库字段类型。 10. **测试代码**:创建一个工具类,如`HibernateUnit.java`,用于...
但在MySQL这样的数据库中,应将其更改为`identity`,因为MySQL使用自动增长的ID字段作为主键。这样,Hibernate将根据数据库特性自动处理主键生成。 接下来,我们需要配置Spring以使用Hibernate。在`...