Hibernate在oracle中ID增長的方式(續)

來源:互聯網
上載者:User

標籤:birt   選擇   csdn   比較   title   知識庫   order   work   sql   

引用連結: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增長的方式(續)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.