天天看點

Hibernate3.6.2 主鍵生成政策

在上篇博文中少提了一點,Hibernate 主鍵的生成政策,這裡簡單記錄一下。

首先先了解一下主鍵生成政策,就是指主鍵生成器,負責生成資料表記錄的主鍵。

1 、自動增長identity

identity 由底層資料庫于為long 、short 、int 類型生成唯一辨別符。identity 是由資料庫自己生成的,但這個主鍵必須設定為自增長。使用SQL Server 和 MySQL 的自增字段,這個方法不能放到 Oracle 中,Oracle 不支援自增字段,要設定sequence (DB2 和 Oracle 中很常用)

特點:與底層資料庫有關,要求資料庫支援Identity ,如MySQl 中是 auto_increment, SQL Server 中是Identity ,支援的資料庫有MySql 、SQL Server 、DB2 、Sybase 和HypersonicSQL 。 Identity 無需Hibernate 和使用者的幹涉,使用較為友善,但不便于在不同的資料庫之間移植程式。

2 、sequence

Sequence 需要底層資料庫支援Sequence 方式,例如DB2 、Oracle 均支援的序列,用于為long 、short 或int 生成唯一辨別

特點:需要底層資料庫的支援序列,支援序列的資料庫有DB2 、PostgreSql 、Qracle 、SAPDb 等在不同資料庫之間移植程式,特别從支援序列的資料庫移植到不支援序列的資料庫需要修改配置檔案

3 、hilo

Hilo 使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然後把算法得到的兩個值拼接起來作為資料庫中的唯一主鍵。Hilo 方式需要額外的資料庫表和字段提供高位值來源。預設請況下使用的表是hibernate_unique_key ,預設字段叫作next_hi 。next_hi 必須有一條記錄否則會出現錯誤。

特點:需要額外的資料庫表的支援,能保證同一個資料庫中主鍵的唯一性,但不能保證多個資料庫之間主鍵的唯一性。Hilo 主鍵生成方式由Hibernate 維護,是以Hilo 方式與底層資料庫無關,但不應該手動修改hi/lo 算法使用的表的值,否則會引起主鍵重複的異常。

4 、native

Native 主鍵生成方式會根據不同的底層資料庫自動選擇Identity 、Sequence 、Hilo 主鍵生成方式。比較常用。

特點:根據不同的底層資料庫采用不同的主鍵生成方式。由于Hibernate 會根據底層資料庫采用不同的映射方式,是以便于程式移植,項目中如果用到多個資料庫時,可以使用這種方式。

5 、seqhilo

sequence 和hilo 的結合,hilo 的高位由sequence 産生,是以也需要底層資料庫的支援

通過hilo 算法實作,但是主鍵曆史儲存在Sequence 中,适用于支援 Sequence 的資料庫,如 Oracle (比較少用)

6 、increment

這個是由Hibernate 在記憶體中生成主鍵,每次增量為1 ,不依賴于底層的資料庫,是以所有的資料庫都可以使用,但問題也随之而來,由于是Hibernate 生成的,是以隻能有一個Hibernate 應用程序通路資料庫,否則就會産生主鍵沖突,不能在叢集情況下使用

插入資料的時候hibernate 會給主鍵添加一個自增的主鍵,但是一個hibernate 執行個體就維護一個計數器,是以在多個執行個體運作的時候不能使用這個方法

7 、uuid.hex

UUID 使用128 位UUID 算法生成主鍵,能夠保證網絡環境下的主鍵唯一性,也就能夠保證在不同資料庫及不同伺服器下主鍵的唯一性。

特點; 能夠保證資料庫中的主鍵唯一性,生成的主鍵占用比較多的存貯空間hibernate 會算出一個16 位的值插入

8 、assigned

由應用程式負責生成主鍵辨別符,往往使用在資料庫中沒有代理主鍵,使用的主鍵與業務相關的情況,如:

<id name="id" column="id" type="string">

    <generator class="assigned" />

</id>

這種主鍵的生成方式不建議使用,在資料庫表設計時就應該使用代理主鍵(surrogate key ),不應使用自然主鍵(natural key 具有業務含義),在沒有指定<generator> 标簽時,預設就是assigned 主鍵的生成方式

在插入資料的時候主鍵由使用者自己添加,hibernate 也不管

9 、foreign

使用外部表的字段作為主鍵

10 、select

使用觸發器生成主鍵(主要用于早期的資料庫主鍵生成機制,少用)

PS:

代理主鍵是指與業務無關且能唯一辨別資料庫中記錄, 一般是資料庫自動生成的, 比如mysql 可以使用auto_increment,Sql2000 可以使用identity 生成方式,oracle 可以使用sequence 生成方式 自然主鍵指業務相關, 由使用者指定, 且能唯一辨別資料庫中的任意一條記錄

總結:

1 、increment :代理主鍵,适合于所有資料庫,由hibernate 維護主鍵自增,和底層資料庫無關,但是不适合于2 個或以上hibernate 程序。

2 、identity :代理主鍵,适合于Mysql 或ms sql server 等支援自增的dbms ,主鍵值不由hibernate 維護。

3 、sequence :代理主鍵,适合于oracle 等支援序列的dbms ,主鍵值不由hibernate 維護,由序列産生。

4 、native :代理主鍵,根據底層資料庫的具體特性選擇适合的主鍵生成政策,如果是mysql 或sqlserver ,選擇identity ,如果是oracle ,選擇sequence 。

5 、hilo :代理主鍵,hibernate 把特定表的字段作為hign 值,生成主鍵值

6 、uuid.hex :代理主鍵,hibernate 采用uuid 128 位算法生成基于字元串的主鍵值

7 、assign :适合于應用程式維護的自然主鍵。

以上記住幾個常用的,其他的以了解為主。

Hibernate3.6.2 主鍵生成政策
Hibernate3.6.2 主鍵生成政策
Hibernate3.6.2 主鍵生成政策
Hibernate3.6.2 主鍵生成政策
Hibernate3.6.2 主鍵生成政策

繼續閱讀