`
panshaobinSB
  • 浏览: 203912 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate实现oracle的主键sequence形式自增加

 
阅读更多
http://www.blogjava.net/wangxinsh55/archive/2008/08/19/222956.html
在hibernate中实现oracle的自动增长

http://kuangbaoxu.javaeye.com/blog/192434

关键字: hibernate oracle sequence native
根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件如下:


[1]oracle数据表的创建脚本:
Java代码
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">  
        <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。


第二种:设置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。

比 较两种做法,第二种做法也就是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中的映射文件可这么写
   <id name="id" type="java.lang.Long" column="ID">
            <generator class="sequence">
                 <param name="sequence">bign</param>
            </generator>
   </id>


<id name="id" type="java.lang.Long" column="ID">
            <generator class="increment">
  </id>


(increment 用与为long,short或者int类型生成唯一标示。只有在没有其他进程忘同一张表中插入数据时才能使用。在集群下不要使用)
分享到:
评论

相关推荐

    Hibernate主键策略-sequence

    Hibernate通过`org.hibernate.id.SequenceGenerator`类来实现序列主键生成器。在`nextValue()`方法中,它会与数据库进行交互,获取序列的下一个值。这个过程涉及到JDBC操作,包括SQL的执行和结果的处理。 3. **...

    在hibernate中实现oracle的自动增长

    在Hibernate中利用Oracle的序列(sequence)实现自动增长,不仅可以简化主键管理,还能提高数据一致性和安全性。通过在Hibernate映射文件中正确配置序列生成器,可以确保每个实体都有一个唯一的标识符,同时避免了手动...

    Hibernate映射文件主键的生成

    在Hibernate中,主键的生成可以通过编程方式、数据库内置机制或者特定的生成器来实现。接下来我们将逐一探讨这些策略: 1. **Identity策略**: 这种策略适用于支持自动增长主键的数据库,如MySQL的`AUTO_INCREMENT...

    Hibernate主键生成方式

    在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...

    hibernate映射主键生成策略native

    本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成策略概述 在Hibernate中,主键生成策略主要包括以下几种: - **identity**:由数据库...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    hibernate中自动生成主键的办法

    在Hibernate中,可以使用`&lt;generator class="sequence"&gt;`来指定使用Sequence作为主键生成策略,并通过`&lt;param name="sequence"&gt;SEQ_CHILD&lt;/param&gt;`来指定具体的序列名称。这种方式适用于需要生成大量连续主键值的...

    Hibernate Oracle sequence的使用技巧

    总之,理解并正确使用Hibernate与Oracle sequence的结合,可以帮助我们更高效地管理和维护数据库中的自增长主键,同时避免潜在的数据冲突问题。在实际开发中,应根据项目需求和数据库特性灵活选择适合的主键生成策略...

    hibernate主键生成策略

    【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...

    hibernate主键生成策略详解

    **seqhilo** 策略与 **hilo** 类似,同样是基于 hi/lo 算法实现的主键生成机制,不同之处在于它使用了序列(sequence)而不是额外的数据表来保存高位值 hi。这种策略适用于支持序列的数据库,例如 Oracle 数据库。 ...

    hibernate的主键生成策略

    在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate...

    Hibernate各种主键生成策略与配置详解

    ### Hibernate 主键生成策略与配置详解 #### 一、概述 在使用Hibernate进行持久化操作时,合理选择和配置主键生成策略对于确保数据的一致性和优化性能至关重要。本文将详细介绍几种常见的主键生成策略,并结合示例...

    常用Hibernate主键生成策略

    如果是Oracle,则采用sequence等。 - **优点**:高度自动化,可以根据所使用的数据库自动选择合适的主键生成策略。 - **缺点**:需要在Hibernate的配置文件中正确设置数据库方言,否则可能无法正常工作。 #### 四...

    hibernate 主键生成策略

    ### Hibernate 主键生成策略详解 Hibernate 是一款流行的 Java 持久层框架,它提供了对象关系映射(ORM)的功能,使得 Java 开发者能够更高效地与数据库进行交互。在 Hibernate 中,主键生成策略是一项核心功能,...

    hibernate连接oracle数据库.doc

    【hibernate 连接 oracle 数据库】 一、Hibernate 概述 Hibernate 是一个流行的 Java 对象关系映射(ORM)框架,它提供了一种在 Java 应用程序中管理和操作关系数据库的方法。ORM 技术的核心思想是将面向对象的模型...

    hibernate连接oracle数据库.pdf

    - **序列创建**:由于Oracle数据库不支持字段自动增长特性,需创建序列`student_sequence`来实现自动增长功能。 ```sql CREATE SEQUENCE student_sequence INCREMENT BY 1 START WITH 1000 NOMAXVALUE NOCYCLE...

Global site tag (gtag.js) - Google Analytics