Hibernate 主鍵建置原則

來源:互聯網
上載者:User
Hibernate主鍵產生 Key Generator 收藏
     Hibernate 主鍵產生器是負責產生資料表記錄的主鍵,通常有如下幾種常見的主鍵產生方式。
Hibernate主鍵產生方式 Key Generator
主鍵產生器:
首先介紹幾種常見的主鍵生生器:
1) increment
increment: 對 long , short 或 int 的資料列產生自動成長主鍵。
主鍵按數值順序遞增。此方式的實現機製為在當前應用執行個體中維持一個變數,以儲存著當前的最大值,之後每次需要產生主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:如果當前有多個執行個體訪問同一個資料庫,那麼由於各個執行個體各自維護主鍵狀態,不同執行個體可能產生同樣的主鍵,從而造成主鍵重複異常。因此,如果同一資料庫有多個實

例訪問,此方式必須避免使用。2) identity
對如 SQL server , MySQL 等支援自動成長列的資料庫,如果資料列的類型是 long, short 或 int ,可使用主鍵產生器產生自動成長主鍵。3) seqhilo
對如 Oracle , DB2 等支援 Sequence 的資料庫,如果資料列的類型是 long,short 或 int ,可使用該主鍵產生器產生自動成長主鍵。 對 Sequence 解釋可以參見
http://easyworld.javaeye.com/blog/214098

4)uuid:
對字串列的資料採用 128-位 uuid 演算法產生唯一的字串主鍵。5) hilo
通過hi/lo 演算法實現的主鍵產生機制,需要額外的資料庫表儲存主鍵產生曆史狀態。6) foreign
使用外部表格的欄位作為主鍵。7) native
由Hibernate根據底層資料庫自行判斷採用identity、hilo、sequence其中一種作為主鍵產生方式,這種方式我在開法過程中經常用到,意思是把主鍵的產生方式交給底層資料庫來決定。8) assigned
主鍵由外部程式負責產生,無需Hibernate參與。9) uuid.hex
由Hibernate基於128 位唯一值產生演算法產生16 進位數值(編碼後以長度32 的字串表示)作為主鍵。10) uuid.string
與uuid.hex 類似,只是產生的主鍵未進行編碼(長度16)。在某些資料庫中可能出現問題(如PostgreSQL)。一般而言,利用uuid.hex方式產生主鍵將提供最好的效能和資料庫平台適應性。另外由於常用的資料庫,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主鍵產生機制(Auto-Increase 欄位或者Sequence)。我們可以在資料庫提供的主鍵產生機制上,採用generator-class=native的主鍵產生方式。不過值得注意的是,一些資料庫提供的主鍵產生機制在效率上未必最佳,大量並發insert資料時可能會引起表之間的互鎖。資料庫提供的主鍵產生機制,往往是通過在一個內部表中儲存當前主鍵狀態(如對於自增型主鍵而言,此內部表中就維護著當前的最大值和遞增量),之後每次插入資料會讀取這個最大值,然後加上遞增量作為新記錄的主鍵,之後再把這個新的最大值更新回內部表中,這樣,一次Insert操作可能導致資料庫內部多次表讀寫操作,同時伴隨的還有資料的加鎖解鎖操作,這對效能產生了較大影響。因此,對於並發Insert要求較高的系統,推薦採用uuid.hex
作為主鍵產生機制。    1、increment 標識符產生器 該產生器由Hibernate以遞增的方式為代理主鍵賦值。在初始化階段,Hibernate讀取表中的最大主索引值,當插入記錄時,在最大值基礎上遞增,增量為1。如果有兩個Hibernate應用進程訪問同一個資料庫表,可能出現同時擷取相同的最大值,導致出現相同的主索引值,從而有一個進程插入失敗!使用範圍:
-產生標識符機制不依賴於底層資料庫系統,所以他適合於所有的資料庫系統。
-適用於只有單個Hibernate應用進程訪問同一個資料庫的場合,在叢集環境下不推薦使用
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。2、identity標識符產生器該產生器由底層資料庫來負責產生標識符,他要求底層資料庫把主鍵定義為自動成長欄位類型。適用範圍:-由於依賴於底層資料庫,所以要求底層資料系統必須支援自動成長欄位類型。包括:DB2、MySQL、MsSQL、Sybase、HSQLDB、Informix等
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。3、sequence標識符產生器該標識符產生器利用底層資料庫提供的序列來產生標識符。
<generator class="sequence">
       <param name="sequence">tester_id_seq</param>
</generator>
在產生的DDL代碼中會產生:
create sequence tester_id_seq;
註:MySQL不支援sequence。當Hibernate在持久化一個SequenceTester對象時,先從底層資料庫的tester_id_seq序列中獲得一個唯一的序號,再把它作為主索引值。適用範圍:-要求底層資料庫必須支援序列,包括:Oracle、DB2、SAP DB、PostgreSQL等。
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。4、hilo標識符產生器hilo標識符產生器由HIbernate按照一種high/low演算法來產生標識符,他從資料庫的特定表欄位中擷取high值
    <id name="id" type="long" column="ID">
    <generator class="hilo">
                <param name="table">hi_value</param>
                <param name="column">next_value</param>
                <param name="max_lo">100</param>
        </generator>
    </id>
上例:high值放在hi_value表的next_value欄位中
Hibernate在持久化一個對象時,需要讀取並修改hi_value表中的next_value值。這段操作在單獨的事務中處理。當save時,不使用當前session對象的當前資料庫聯結和事務,而是在一個新的資料庫連接中建立新事務,然後訪問hi_value表。適用範圍:-適用於所有的資料庫系統。
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。
-只能在一個資料庫中保證標識符唯一
-當使用者為Hibernate自行提供資料庫聯結,或者Hibernate通過JTA,從應用伺服器的資料來源獲得資料庫聯結時無法適用hilo,因為這樣不能保證hilo在新的資料庫連接的事務中訪問hi_value表。在這種情況下,如果資料庫系統支援序列,可以適用seqhilo產生器。對於支援序列的資料庫系統,可以適用seqhilo,它從序列中擷取high值。5、native標識符產生器該產生器依據底層資料庫對自動產生標識符的支援能力,來選擇適用identity、sequence或hilo標識符產生器。能自動判斷底層資料庫提供的產生標識符的機制。適用範圍:-適合於跨資料庫平台開發,即同一個Hibernate應用需要串連多種資料庫系統的場合
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.