1. 程式人生 > >hibernate 對映檔案中id 及id Generator的詳解

hibernate 對映檔案中id 及id Generator的詳解

   所有的生成器都實現了org.hibernate.id.IdentifierGenerator介面。這是一個非常簡單的介面;某些應用程式可以選擇提供他們自己特定的實現。當然,Hibernate提供了很多內建的實現。下面是一些內建生成器的快捷名字:

increment(遞增)  用於為long, short或者int型別生成唯一標識。只有在沒有其他程序往同一張表中插入資料時才能使用。 在叢集下不要使用。 identity (標識) 對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內建標識欄位提供支援。返回的識別符號是long, short 或者int型別的。 sequence (序列)  在DB2,PostgreSQL, 

Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的識別符號是long, short或者 int型別的。 hilo (高低位)  使用一個高/低位演算法來高效的生成long, short或者 int型別的識別符號。給定一個表和欄位(預設分別是hibernate_unique_key 和next_hi)作為高位值的來源。高/低位演算法生成的識別符號只在一個特定的資料庫中是唯一的。 seqhilo(使用序列的高低位)  使用一個高/低位演算法來高效的生成long, short或者 int型別的識別符號,給定一個數據庫序列(sequence)的名字。 uuid 用一個128位的UUID演算法生成字串型別的識別符號。在一個網路中唯一(使用了IP地址)。UUID被編碼為一個32位16進位制數字的字串。

guid

在MS SQL Server 和 MySQL 中使用資料庫生成的GUID字串。

native(本地)  根據底層資料庫的能力選擇identity, sequence 或者hilo中的一個。assigned (自行分配) 主鍵由外部程式負責生成,無需Hibernate參與 讓應用程式在save()方法呼叫之前為物件分配一個標示符。這是 <generator>元素沒有指定時的預設生成策略。

select  通過資料庫觸發器選擇一些唯一主鍵的行並返回主鍵值來分配一個主鍵。 foreign(外部引用)  使用另外一個相關聯的物件的識別符號。常常和<one-to-one>聯合一起使用。

以下內容摘自:http://ohgrateboy.iteye.com/blog/511019

一:主鍵生成策略大體分類:  1:hibernate 負責對主鍵ID賦值  2:應用程式自己為主鍵ID賦值(不推薦使用)  3:底層資料庫為主鍵ID賦值  二:具體用法  1:increment:(跨平臺的)  以遞增的方式為代理主鍵賦值,每次維護的當前例項中取出一個最大值,在最大值的基礎之上再進行加法,適合只有單個應用程序訪問資料的情況,否則會產生併發衝突問題(主鍵重複)。並且oid 的型別必須是long ,int ,short型別的。 2:assigned :由程式設計師給賦值,(不建議使用)  3:identity:是由底層的資料庫來生成主鍵,他要求底層資料庫支援自動增長,並且把主鍵定義成自動增長型別的 ,oid 必須是long ,int ,short 型別的。 Oracle 不支援。Mysql 支援  4:sequence:由底層的資料根據序列來生成主鍵。oracle ,db2資料庫支援,mysql不支援

5:native:(跨平臺的)  由hibernate 自己跟據不同的資料庫的主鍵生成方式,自己選擇生成方式(可以跨平臺)  6:hilo :(跨平臺的),通過hi/lo演算法實現主鍵的生成機制,但是需要額外的表來儲存主鍵的生成歷史,使用時要先插入一個值。  使用規則: 通用性和安全性:  7:seqhilo:取得sequence的值,來生成高位,產生id。  但是隻能使用於有sequence的資料庫(oracle , db2);  8:uuid.hex:  用系統時間和ip地址等具有天然唯一性的資源進行計算,生成id,  全球唯一。生成的是一個128位的二進位制數。然後把這個二進位制數,轉化成一個16進位制的數(32位),再轉化為字串付給我們的id。那麼我們的實體類的oid以及資料庫的主鍵都需要隨之改為字串型別的。 9:foreign  用於共享主鍵的時候。(一對一主鍵關聯);