1.assigned:
主鍵由外部程式負責產生,無需Hibernate參與。----如果要由程式碼來指定主鍵,就采有這種.
2.increment:
對 long , short 或 int 的資料列產生自動成長主鍵。increment主鍵產生方式的特點是與底層資料庫無關性,大部分資料庫如 Mysql,MSSQL 和ORACLE等都支援increament產生方式。此方式的實現機製為在當前應用執行個體中維持一個變數,以儲存著當前的最大值,之後每次需要產生主鍵的 時候將此值加1作為主鍵。increment方式的不足之處是當多個線程並發對資料庫表進行寫操作時,可能出現相同的主索引值,發生主鍵重複的衝突,因此多線程並行作業時,不應該使用此方法。
3.identity:
如果資料列的類型是 long, short 或 int ,可使用主鍵產生器產生自動成長Hibernate主鍵。與底層資料庫有關,要求資料庫支援identify,如MySQL中是auto_increment,SQL Server中是Identify.支援的資料庫有MySQL,SQL Server,DB2,Sybase和HypersonicSQL.(好像不支援oracle) 無需Hibernate和使用者的幹涉,使用較為方便,但不便於在不同的資料庫之間移植程式。identity的優點是不會發生 increment方式的並發錯做問題。資料庫涉及到的表要設定自動成長。
4.sequence:
在ORACLE等資料庫中使用sequence產生主鍵。sequence的特點是於資料庫的相關性,seqhio要求底層能支援sequence,列如Oracle。
5.hilo:
通過hi/lo 演算法產生主鍵,需要一個表來儲存額外的主鍵資訊。這樣產生的標識符只在特定的資料庫是唯一的,在使用JTA(Java分散式交易) 獲得連結或使用者自訂提供的連結中,不要使用這種產生器。hilo方式需要維護表資訊,因此對資料的影響的要率會造成一定影響。
6.seqhio:
與hilo 類似,通過hi/lo 演算法實現的主鍵產生機制,只是主鍵曆史狀態儲存在Sequence中,適用於支援Sequence的資料庫,如Oracle。如果資料列的類型是 long, short 或 int可使用該主鍵產生器。
7.native:
由Hibernate根據不同的資料庫方言,自行判斷採用identity、hilo、sequence其中一種作為Hibernate主鍵產生方式,native的 優點是與底層性無關,便於不同資料庫之間的移植,由Hibernate根據不同資料庫選擇主鍵的產生方式。在oracle中需要建立叫 Hibernate_sequence名字的sequence,如果設定了Hibernate.hbm2ddl.auto屬性,不需要手動建立序列,前提 是資料庫帳號必須有Create Sequence這種進階許可權。mysql等資料庫則不用建立sequence。
8.uuid.hex:
採用基於128位的演算法產生唯一值,並編製成32位長度的唯一字串作為主索引值,uuid.hex的優點是支援大部分資料庫,缺點就是要佔用較大的儲存空間。對於並發Insert要求較高的系統,推薦採用uuid.hex 作為主鍵產生機制。
9.uuid.string:
使用UUID演算法,UUID被編碼為一個16個字元長的任意ASCII字元組成的字串。不能在PostgreSQL資料庫中使用。uuid.string同uuid.hex類似,需要佔很大的儲存空間。
10.foreign:
使用外部表格的欄位作為Hibernate主鍵。
一般而言,利用uuid.hex方式產生Hibernate主鍵將提供最好的效能和資料庫平台適應性。
另外由於常用的資料庫,如Oracle、DB2、 SQLServer、MySql 等,都提供了易用的主鍵產生機制(Auto-Increase 欄位或者Sequence)。我們可以在資料庫提供的主鍵產生機制上,採用generator-class=native的主鍵產生方式。不過值得注意的 是,一些資料庫提供的主鍵產生機制在效率上未必最佳,大量並發insert資料時可能會引起表之間的互鎖。資料庫提供的主鍵產生機制,往往是通過在一個內 部表中儲存當前主鍵狀態(如對於自增型主鍵而言,此內部表中就維護著當前的最大值和遞增量),之後每次插入資料會讀取這個最大值,然後加上遞增量作為新記 錄的主鍵,之後再把這個新的最大值更新回內部表中,這樣,一次Insert操作可能導致資料庫內部多次表讀寫操作,同時伴隨的還有資料的加鎖解鎖操作,這對效能產生了較大影響。因此,對於並發Insert要求較高的系統,推薦採用uuid.hex 作為主鍵產生機制。