Hibernate主鍵增長方式

1.assigned:mysql

主鍵由外部程序負責生成,無需Hibernate參與。----若是要由程序代碼來指定主鍵,就採有這種.算法

2.increment:sql

對 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

在ORACLE等數據庫中使用sequence生成主鍵。sequence的特色是於數據庫的相關性,seqhio要求底層能支持sequence,列如Oracle。分佈式

5.hilo:ide

經過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、DB二、 SQLServer、MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 字段或者Sequence)。咱們能夠在數據庫提供的主鍵生成機制上,採用generator-class=native的主鍵生成方式。不過值得注意的 是,一些數據庫提供的主鍵生成機制在效率上未必最佳,大量併發insert數據時可能會引發表之間的互鎖。數據庫提供的主鍵生成機制,每每是經過在一個內 部表中保存當前主鍵狀態(如對於自增型主鍵而言,此內部表中就維護着當前的最大值和遞增量),以後每次插入數據會讀取這個最大值,而後加上遞增量做爲新記 錄的主鍵,以後再把這個新的最大值更新回內部表中,這樣,一次Insert操做可能致使數據庫內部屢次表讀寫操做,同時伴隨的還有數據的加鎖解鎖操做,這對性能產生了較大影響。所以,對於併發Insert要求較高的系統,推薦採用uuid.hex 做爲主鍵生成機制。

相關文章
相關標籤/搜索