1. 程式人生 > >hibernate學習之主鍵生成策略

hibernate學習之主鍵生成策略

一、Hibernate最常用的主鍵生成策略為native和uuid。

native可以根據資料庫不同自動選擇sequence、identity和hilo其中的一種。

<id name="uId" column="uId">
 <!-- 設定資料庫表id增長策略(自動增長:native)-->
      <generator class="native"></generator>
</id>

uuid:hibernate可以自動生成UUID的值,實體類中主鍵屬性的型別必須為String型別

<generator class="uuid"></generator>

二、Hibernate常用的主鍵生成策略的原理、特點、應用場合

1. increment

 a)用於long、short、int型別,對主鍵值採取自動順序增長的方式生成新的主鍵,值預設從1開始。

 b)原理:在當前應用例項中維持一個變數,以儲存當前最大值,之後每次需要生成主鍵值的時候將此值加1作為主鍵。

 c)適用於代理主鍵,不依賴於底層的資料庫,因此所有的資料庫都可以使用。

 d)缺點:此種主鍵生成策略不適用於叢集、同一時段大量使用者併發訪問的系統,即當大量使用者同一時間段同時進行插入操作的時候,可能存在取得相同的最大值然後再同時+1的情況,這個時候就會造成主鍵衝突。因此,

如果同一資料庫有多個例項訪問,此方式必須避免使用。

2. identity

 a)採用底層資料庫本身提供的主鍵生成識別符號,條件是資料庫支援自動增長資料型別,不同的資料庫用不同的主鍵增長方式。

 b)特點: 與底層資料庫有關,要求資料庫支援Identity如MySQl中是auto_increment, SQL Server 中是Identity。支援的資料庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。

 c)好處:要求在建表的時候指定主鍵為自增長型別,實際開發中就不需要自己定義插入資料庫的主鍵值,系統會自動順序遞增一個值。Identity無需Hibernate和使用者的干涉,使用較為方便,但由於

依賴於資料庫,所以不便於在不同的資料庫之間移植程式。

 d)適用於代理主鍵。

3. sequence

 a)sequence實際是就是一張單行單列的表。

 b)實現原理:呼叫資料庫中底層存在的sequence生成主鍵,需要底層資料庫的支援序列,因此他是依賴於資料庫

 c)支援sequence的資料庫有:Oracle 、DB2(Mysql/SQlServer不支援)、PostgreSql、SAPDb等。

 d)適用於代理主鍵。

4. hilo

 a)原理:通過hi/lo 演算法(hilo使用高低位演算法生成主鍵,高低位演算法使用一個高位值和一個低位值,然後把演算法得到的兩個值拼接起來)實現的主鍵生成機制,需要額外的資料庫表儲存主鍵生成歷史狀態。

 b)特點:需要額外的資料庫表和欄位提供高位值來源。

 c)預設情況下使用的表是hibernate_unique_key,預設欄位叫next_hi。next_hi必須有一條記錄否則會出現錯誤。

 d)需要額外的資料庫表的支援,能保證同一個資料庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。

 e)hilo主鍵生成方式由Hibernate 維護,所以hilo方式與底層資料庫無關

5.  native

 a)作用:根據資料庫的型別,自動選擇sequence、identity和hilo其中的一種。

 b)實現自動切換的依據:根據Hibernate配置檔案中的方言來判斷是Oracle還是MySQL、SQLServer,然後針對資料庫的型別抉擇sequence還是identity作為主鍵生成策略。

 c)用處:由於Hibernate會根據底層資料庫採用不同的對映方式,因此靈活性高,便於程式移植,專案中如果用到多個數據庫時,可以使用這種方式。

6. uuid

 a)原理uuid使用128位UUID演算法生成主鍵,能夠保證網路環境下的主鍵唯一性,也就能夠保證在不同資料庫及不同伺服器下主鍵的唯一性。所以使用於所有資料庫。

 b)特點:能夠保證資料庫中的主鍵唯一性,但是在生成的主鍵佔用比較多的存貯空間。

7. assigned

 a)作用:用於手工分配主鍵生成器,一旦指定為這個了,Hibernate就不在自動為程式做主鍵生成器了。沒有指定<generator>標籤時,預設就是assigned主鍵的生成方式。

 b)使用方法:在程式中session.save();之前,由程式設計師自己指定主鍵值為多少。例如:user.setId(1);這就是在程式中程式設計師手動為使用者表指定主鍵值為1。

8. foreign

  只適用基於共享主鍵的一對一關聯對映的時候使用。即一個物件的主鍵是參照的另一張表的主鍵生成的。

三、關於主鍵生成策略的選擇:

  一般來說推薦uuid,因為生成主鍵唯一,且對資料庫無依賴,可移植性強;或者native,可自動幫你選擇資料庫。

   不過值得注意的是,一些資料庫提供的主鍵生成機制在效率上未必最佳,大量併發insert資料時可能會引起表之間的互鎖。

   因此,對於併發Insert要求較高的系統,推薦採用uuid作為主鍵生成機制。具體選擇還要具體情況具體分析,一般而言,利用uuid方式生成主鍵將提供最好的效能和資料庫平臺適應性。