hibernate系列筆記(4)---主鍵建置原則

來源:互聯網
上載者:User

標籤:ide   images   需要   base   計算   格式   htm   查詢   主鍵   

主鍵建置原則

常見的建置原則分為六種

       

1、increment   

由Hibernate從資料庫中取出主鍵的最大值(每個session只取1次),以該值為基礎,每次增量為1,在記憶體中產生主鍵,不依賴於底層的資料庫,因此可以跨資料庫。

<id name="id" column="id">

<generator class="increment" />

</id>

Hibernate調用org.hibernate.id.IncrementGenerator類裡面的generate()方法,使用select max(idColumnName) from tableName語句擷取主鍵最大值。該方法被聲明成了synchronized,所以在一個獨立的Java虛擬機器內部是沒有問題的,然而,在多個JVM同時並發訪問資料庫select max時就可能取出相同的值,再insert就會發生Dumplicate entry的錯誤。所以只能有一個Hibernate應用進程訪問資料庫,否則就可能產生主鍵衝突,所以不適合多進程並發更新資料庫,適合單一進程訪問資料庫,不能用於群集環境。

官方文檔:只有在沒有其他進程往同一張表中插入資料時才能使用,在叢集下不要使用。

特點:跨資料庫,不適合多進程並發更新資料庫,適合單一進程訪問資料庫,不能用於群集環境。

2.identity

identity由底層資料庫產生標識符。identity是由資料庫自己產生的,但這個主鍵必須設定為自增長,使用identity的前提條件是底層資料庫支援自動成長欄位類型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle這類沒有自增欄位的則不支援。

<id name="id" column="id">

<generator class="identity" />

</id>

例:如果使用MySQL資料庫,則主鍵欄位必須設定成auto_increment。

id int(11) primary key auto_increment

特點:只能用在支援自動成長的欄位資料庫中使用,如MySQL。不會產生安全執行緒問題

3.sequence

採用資料庫提供的sequence機制產生主鍵,需要資料庫支援sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL這種不支援sequence的資料庫則不行(可以使用identity)。

<generator class="sequence">

<param name="sequence">hibernate_id</param>

</generator>

<param name="sequence">hibernate_id</param> 指定sequence的名稱

Hibernate產生主鍵時,尋找sequence並賦給主索引值,主索引值由資料庫產生,Hibernate不負責維護,使用時必須先建立一個sequence,如果不指定sequence名稱,則使用Hibernate預設的sequence,名稱為hibernate_sequence,前提要在資料庫中建立該sequence。

特點:只能在支援序列的資料庫中使用,如Oracle。

4.native

native由hibernate根據使用的資料庫自行判斷採用identity、hilo、sequence其中一種作為主鍵產生方式,靈活性很強。如果能支援identity則使用identity,如果支援sequence則使用sequence。

<id name="id" column="id">

<generator class="native" />

</id>

例如MySQL使用identity,Oracle使用sequence

注意:如果Hibernate自動選擇sequence或者hilo,則所有的表的主鍵都會從Hibernate預設的sequence或hilo表中取。並且,有的資料庫對於預設情況主鍵產生測試的支援,效率並不是很高。

使用sequence或hilo時,可以加入參數,指定sequence名稱或hi值表名稱等,如

<param name="sequence">hibernate_id</param>

特點:根據資料庫自動選擇,項目中如果用到多個資料庫時,可以使用這種方式,使用時需要設定表的自增欄位或建立序列,建立表等。

5、uuid

UUID:Universally Unique Identifier,是指在一台機器上產生的數字,它保證對在同一時空中的所有機器都是唯一的。按照開放軟體基金會(OSF)制定的標準計算,用到了乙太網路卡地址、納秒級時間、晶片ID碼和許多可能的數字,標準的UUID格式為:

xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)

其中每個 x 是 0-9 或 a-f 範圍內的一個十六進位的數字。

<id name="id" column="id">

<generator class="uuid" />

</id>

Hibernate在儲存對象時,產生一個UUID字串作為主鍵,保證了唯一性,但其並無任何商務邏輯意義,只能作為主鍵,唯一缺點長度較大,32位(Hibernate將UUID中間的“-”刪除了)的字串,佔用儲存空間大,但是有兩個很重要的優點,Hibernate在維護主鍵時,不用去資料庫查詢,從而提高效率,而且它是跨資料庫的,以後切換資料庫極其方便。

特點:uuid長度大,佔用空間大,跨資料庫,不用訪問資料庫就產生主索引值,所以效率高且能保證唯一性,移植非常方便,推薦使用。

6、assigned

主鍵由外部程式負責產生,在 save() 之前必須指定一個。Hibernate不負責維護主鍵產生。與Hibernate和底層資料庫都無關,可以跨資料庫。在儲存物件前,必須要使用主鍵的setter方法給主鍵賦值,至於這個值怎麼產生,完全由自己決定,這種方法應該盡量避免。

<id name="id" column="id">

<generator class="assigned" />

</id>

“ud”是自訂的策略名,人為起的名字,後面均用“ud”表示。

特點:可以跨資料庫,人為控制主鍵產生,應盡量避免。

 我這裡就講到這裡,更詳細的可以參考:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html

 謝謝!

  

hibernate系列筆記(4)---主鍵建置原則

聯繫我們

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