Hibernate介紹之generator class=""詳解

“uuid”

由 Hibernate 基於 128 位 UUID 算法 生成 16 進制數值(編碼後以長度 32 的字符串表示)作爲主鍵。

“assigned”

主鍵由外部程序負責生成,在 save() 之前指定一個。

“hilo”

通過 hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。

“seqhilo”

與 hilo 類似,通過 hi/lo 算法實現的主鍵生成機制,需要數據庫中的 Sequence,適用於支持 Sequence 的數據庫,如 Oracle。

“increment”

主鍵按數值順序遞增。此方式的實現機制爲在當前應用實例中維持一個變量,以保存着當前的最大值,之後每次需要生成主鍵的時候將此值加 1 作爲主鍵。這種方式可能產生的問題是:不能在集羣下使用。

“identity”

採用數據庫提供的主鍵生成機制。如 DB2、SQL Server、MySQL 中的主鍵生成機制。

“sequence”

採用數據庫提供的 sequence 機制生成主鍵。如 Oralce 中的 Sequence。

“native”

由 Hibernate 根據使用的數據庫自行判斷採用 identity、hilo、sequence 其中一種作爲主鍵生成方式。

“uuid.string”

與 uuid.hex 類似,只是生成的主鍵未進行編碼(長度 16),不能應用在 PostgreSQL 數據庫中。

“foreign”

使用另外一個相關聯的對象的標識符作爲主鍵。

元素中的 < generator > 用來爲該持久化類的實例生成唯一的標識,hibernate 提供了很多內置的實現。

Increment: 由 hibernate 自動遞增生成標識符, 用於爲 long, short 或者 int 類型生成唯一標識。
identity : 由底層數據庫生成標識符 (自動增長), 返回的標識符是 long, short 或者 int 類型的。
sequence :hibernate 根據底層數據庫序列生成標識符, 返回的標識符 是 long, short 或者 int 類型的。

hilo : 使用一個高 / 低位算法來高效的生成 long, short 或者 int 類型的標識符。
uuid.hex : 用一個 128-bit 的 UUID 算法生成 32 位字符串類型的標識符。
native : 根據底層數據庫的能力選擇 identity, sequence 或者 hilo 中的一個。
assigned : 讓應用程序在 save() 之前爲對象分配一個標示符。
foreign : 使用另外一個相關聯的對象的標識符。和 聯合一起使用。

一、id 生成方式
1,序列 sequence 只適用於 Oracle

<id > 
<generator class="sequence"> 
<param >person_seq</param><!-- 指定 sequence 名 --> 
</generator> 
</id> 

2,自增列,適用於 SQLServer、MySql

<id > 
<generator class="identity"/> 
</id> 

3,取最大值加一

<id > 
<generator class="increment"/> 
</id> 

4,根據底層數據庫指定生成方法

<id > 
<generator class="native"/> 
</id> 

使用缺省策略
針對 Oracle 數據庫的生成方式還是 sequence,只不過需要一個特定名字的 sequence,”hibernate_sequence”。

5,高低位算法

<id > 
<generator class="hilo"> 
<param >high_value</param> 
<!-- 設置高位值取值的表 --> 
<param >next_value</param> 
<!-- 設置高位值取值的字段 --> 
<param >50</param> 
<!-- 指定低位最大值,當取道最大值是會再取一個高位值再運算 --> 
</generator> 
</id> 

以上是 hilo 算法的普通形式,不適合用於 squenece
在一個會話中保存多個對象

二、Hibernate 中對類關係的處理:
one―to―one 關係在數據庫中如何體現,在 JavaBean 中如何體現,在
Hibernate 中如何映射 one-to-one 關係。
1、 數據庫中:一個表的外健對應另一個表的主健,外健要加上 Unique 約束 (外健關聯)。或者是兩個表共享一個主健, 表現爲子表中的 pk 同時引用了父表的 pk 作外健而存在(主健關聯,子表中的 pk 和 fk 爲一個字段)。
2、 javaBean 中:在 JavaBean 中增加一個屬性,即另外一個對象的引用,可以單向也可以雙向。
3、 在 hibernate 中:

A、主健映射:都是 one-to-one 要用 foreign 生成策略。
以汽車 car 和發動機 Engine(一對一關係)爲例:
a、主表 Car.hbm.xml 的寫法

<class > 
<id > 
<generator class="native" /> 
</id> 
<property /> 
<one-to-one /> 
</class> 

注:cascade=”all” 表示增刪改查 Car 對象時都會級聯增加、刪除和修改 Engine 對象。
級聯一定是在主對象的映射文件中

b、附表 Engine.hbm.xml 的寫法

<class > 
<id > 
<generator class="foreign"> 
<param >car</param> 
</generator> 
</id> 
<property /> 
<one-to-one c/> 
</class> 

注:c 表示 Engine 應用了 Car 的主健作爲外健。
foregin 表明 id 的生成方式是引用表 car 的主鍵

B、外健映射:主表中用 one-to-one,通過 property -ref many-to-one
a、主表 Car.hbm.xml 的寫法

<class > 
<id > 
<generator class="native" /> 
</id> 
<property /> 
<one-to-one  
property-ref="car" cascade="save-update"/> 
</class> 

注: 表示 engine 表引用了 car 表的主健作爲他的外健。
cascade=”save-update” 表示增改 Car 對象時都會級聯增加和修改 Engine 對象。

b、附表 Engine.hbm.xml 的寫法

<class > 
<id > 
<generator class="native" /> 
</id> 
<property /> 
<many-to-one  
unique="ture"  column="carid"/> 
</class> 

注:unique=”ture” column=”carid” 表示爲 engine 表中的外健 carid 加上唯一約束,使之一對多關係強制轉化爲一對一關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章