剖析Hibernate主鍵生成幾種常用方式
Hibernate主鍵還是比較常用的,于是我研究了一下Hibernate主鍵生成,在這里拿出來和大家分享一下,希望對大家有用。
1.assigned:
主鍵由外部程序負責(zé)生成,無需Hibernate參與。----如果要由程序代碼來指定主鍵,就采有這種.
2.increment:
對 long , short 或 int 的數(shù)據(jù)列生成自動增長主鍵。increment主鍵生成方式的特點是與底層數(shù)據(jù)庫無關(guān)性,大部分數(shù)據(jù)庫如 Mysql,MSSQL 和ORACLE等都支持increament生成方式。此方式的實現(xiàn)機制為在當(dāng)前應(yīng)用實例中維持一個變量,以保存著當(dāng)前的***值,之后每次需要生成主鍵的 時候?qū)⒋酥导?作為主鍵。increment方式的不足之處是當(dāng)多個線程并發(fā)對數(shù)據(jù)庫表進行寫操作時,可能出現(xiàn)相同的主鍵值,發(fā)生主鍵重復(fù)的沖突,因此多線程并發(fā)操作時,不應(yīng)該使用此方法。
3.identity:
如果數(shù)據(jù)列的類型是 long, short 或 int ,可使用主鍵生成器生成自動增長Hibernate主鍵。與底層數(shù)據(jù)庫有關(guān),要求數(shù)據(jù)庫支持identify,如MySQL中是auto_increment,SQL Server中是Identify.支持的數(shù)據(jù)庫有MySQL,SQL Server,DB2,Sybase和HypersonicSQL.(好像不支持oracle) 無需Hibernate和用戶的干涉,使用較為方便,但不便于在不同的數(shù)據(jù)庫之間移植程序。identity的優(yōu)點是不會發(fā)生 increment方式的并發(fā)錯做問題。數(shù)據(jù)庫涉及到的表要設(shè)置自動增長。
4.sequence:
在ORACLE等數(shù)據(jù)庫中使用sequence生成主鍵。sequence的特點是于數(shù)據(jù)庫的相關(guān)性,seqhio要求底層能支持sequence,列如Oracle。
5.hilo:
通過hi/lo 算法生成主鍵,需要一個表來保存額外的主鍵信息。這樣生成的標識符只在特定的數(shù)據(jù)庫是唯一的,在使用JTA(Java分布式事務(wù)) 獲得鏈接或用戶自定義提供的鏈接中,不要使用這種生成器。hilo方式需要維護表信息,因此對數(shù)據(jù)的影響的要率會造成一定影響。
6.seqhio:
與hilo 類似,通過hi/lo 算法實現(xiàn)的主鍵生成機制,只是主鍵歷史狀態(tài)保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫,如Oracle。如果數(shù)據(jù)列的類型是 long, short 或 int可使用該主鍵生成器。
7.native:
由Hibernate根據(jù)不同的數(shù)據(jù)庫方言,自行判斷采用identity、hilo、sequence其中一種作為Hibernate主鍵生成方式,native的 優(yōu)點是與底層性無關(guān),便于不同數(shù)據(jù)庫之間的移植,由Hibernate根據(jù)不同數(shù)據(jù)庫選擇主鍵的生成方式。在oracle中需要創(chuàng)建叫 Hibernate_sequence名字的sequence,如果設(shè)置了Hibernate.hbm2ddl.auto屬性,不需要手動建立序列,前提 是數(shù)據(jù)庫帳號必須有Create Sequence這種高級權(quán)限。mysql等數(shù)據(jù)庫則不用建立sequence。
8.uuid.hex:
采用基于128位的算法生成唯一值,并編制成32位長度的唯一字符串作為主鍵值,uuid.hex的優(yōu)點是支持大部分數(shù)據(jù)庫,缺點就是要占用較大的存儲空間。對于并發(fā)Insert要求較高的系統(tǒng),推薦采用uuid.hex 作為主鍵生成機制。
9.uuid.string:
使用UUID算法,UUID被編碼為一個16個字符長的任意ASCII字符組成的字符串。不能在PostgreSQL數(shù)據(jù)庫中使用。uuid.string同uuid.hex類似,需要占很大的存儲空間。
10.foreign:
使用外部表的字段作為Hibernate主鍵。
一般而言,利用uuid.hex方式生成Hibernate主鍵將提供***的性能和數(shù)據(jù)庫平臺適應(yīng)性。
另外由于常用的數(shù)據(jù)庫,如Oracle、DB2、 SQLServer、MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 字段或者Sequence)。我們可以在數(shù)據(jù)庫提供的主鍵生成機制上,采用generator-class=native的主鍵生成方式。不過值得注意的 是,一些數(shù)據(jù)庫提供的主鍵生成機制在效率上未必***,大量并發(fā)insert數(shù)據(jù)時可能會引起表之間的互鎖。數(shù)據(jù)庫提供的主鍵生成機制,往往是通過在一個內(nèi) 部表中保存當(dāng)前主鍵狀態(tài)(如對于自增型主鍵而言,此內(nèi)部表中就維護著當(dāng)前的***值和遞增量),之后每次插入數(shù)據(jù)會讀取這個***值,然后加上遞增量作為新記 錄的主鍵,之后再把這個新的***值更新回內(nèi)部表中,這樣,一次Insert操作可能導(dǎo)致數(shù)據(jù)庫內(nèi)部多次表讀寫操作,同時伴隨的還有數(shù)據(jù)的加鎖解鎖操作,這對性能產(chǎn)生了較大影響。因此,對于并發(fā)Insert要求較高的系統(tǒng),推薦采用uuid.hex 作為主鍵生成機制。
【編輯推薦】