Hibernate 之主鍵生成策略小總結

主鍵生成策略大體分兩種:程序員

  • 手工控制策略
  • 自動生成策略【框架自動生成和數據庫自動生成】

手工控制策略:算法

assigned:類型是任意的,須要在 save() 到數據庫前,編碼人員手工設置主鍵值,也就是調用對象的 setter方法進行賦值操做。sql

注:能夠跨數據庫,可是手動控制不能保證不重複,不推薦使用。數據庫

自動生成策略:服務器

1 . uuid:自動生成 32 位及以上的隨機字符串,生成的依據包括但不限於網卡地址,時間值等。多線程

注:能夠跨數據庫,效率高,能保證惟一性,推薦使用【雖然佔用空間大】併發

2 . increment:自動獲取數據庫中主鍵的最大值【整數型】,自動加一後賦值給對象。框架

注:能夠跨數據庫,可是不適合羣集下使用,多線程併發更新數據庫會取出相同的主鍵值。dom

3 . identity:數據庫主鍵設爲自動增加【整數型】。ide

注:適用於MySQL,DB2,SQLserver,不適用於Oracle。

4 . sequence:數據庫主鍵設爲自動增加【整數型】。

注:適用於Oracle。

5 . hilo:Hibernate 中最經常使用的一種生成方式,須要一張額外的表保存 hi 的值。保存 hi 值的表至少有一條記錄(只與第一條記錄有關),不然會出現錯誤。

<id name="id" column="id">
    <generator class="hilo">
        <param name="table">hibernate_hilo</param>
        <param name="column">next_hi</param>
        <param name="max_lo">100</param>
    </generator>
</id>

<!--  指定保存hi值的表名  -->
<param name="table">hibernate_hilo</param>
<!--  指定保存hi值的列名  -->
<param name="column">next_hi</param> 
<!--  指定低位的最大值  -->
<param name="max_lo">100</param> 
<!--  也能夠省略table和column配置,其默認的表爲hibernate_unique_key,列爲next_hi  -->
<id name="id" column="id">
    <generator class="hilo">
        <param name="max_lo">100</param>
    </generator>
</id>

hilo生成器生成主鍵的過程(以hibernate_unique_key表,next_hi 列爲例):

  • 得到hi值:讀取並記錄數據庫的hibernate_unique_key表中next_hi字段的值,數據庫中此字段值加1保存。
  • 得到lo值:從0到max_lo循環取值,差值爲1,當值爲max_lo值時,從新獲取hi值,而後lo值繼續從0到max_lo循環。
  • 根據公式 hi * (max_lo + 1) + lo計算生成主鍵值。

注意:當hi值是0的時候,那麼第一個值不是0*(max_lo+1)+0=0,而是lo跳過0從1開始,直接是一、二、3……

那max_lo配置多大合適呢?

     這要根據具體狀況而定,若是系統通常不重啓,並且須要用此表創建大量的主鍵,能夠吧max_lo配置大一點,這樣能夠減小讀取數據表的次數,提升效率;反之,若是服務器常常重啓,能夠吧max_lo配置小一點,能夠避免每次重啓主鍵之間的間隔太大,形成主鍵值主鍵不連貫。

注:能夠跨數據庫,hilo算法生成的標誌只能在一個數據庫中保持惟一。

6 . native:native由hibernate根據使用的數據庫自行判斷採用identity、hilo、sequence其中一種做爲主鍵生成方式,靈活性很強。若是能支持identity則使用identity,若是支持sequence則使用sequence。

注:根據數據庫自動選擇,項目中若是用到多個數據庫時,可使用這種方式,使用時須要設置表的自增字段或創建序列,創建表等。

7 . foreign:用於一對一關聯關係中。

<id name="id" column="id">
    <generator class="foreign">
         <param name="property">user</param>
    </generator>
</id>
<one-to-one name="user" class="com.msym.domain.User" constrained="true" />

注:用的少,只用於一對一關聯關係【一對一關聯關係通常都合爲一張表】。

 

 

小總結:

主鍵生成策略

由誰生成OID

數據庫id字段類型

兼容數據庫

assigned

程序員控制輸入

不限定

全部

uuid

Hibernate內部控制輸入

字符串類型

全部

increment

Hibernate內部控制輸入

整型

全部

identity

數據庫底層控制輸入

整型自增

Mysql可用

sequence

數據庫底層控制輸入

整型

Oracle可用

native

數據庫底層控制輸入

整型自增

全部

相關文章
相關標籤/搜索