hibernateid屬性generatorclass=””詳解

小新的蠟筆發表於2015-03-17

原文來自:http://blog.csdn.net/yufaw/article/details/7680403

“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.hex” 

  

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

  

  

“uuid.string” 

  

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

    

  

“foreign” 

  

使用另外一個相關聯的物件的識別符號作為主鍵。 


<id>元素中的<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 :使用另外一個相關聯的物件的識別符號。和<one-to-one>聯合一起使用。

一、id生成方式 

1,序列sequence 只適用於Oracle 

<id name=”id” column=”id”> 

<generator class=”sequence”> 

<param name=”sequence”>person_seq</param><!–指定sequence名–> 

</generator> 

</id> 



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

<id name=”id” column=”id”> 

<generator class=”identity”/> 

</id> 



3,取最大值加一 

<id name=”id” column=”id” type=”integer”> 

<generator class=”increment”/> 

</id> 



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

<id name=”id” column=”id”> 

<generator class=”native”/> 

</id> 

使用預設策略 

針對Oracle資料庫的生成方式還是sequence,只不過需要一個特定名字的sequence,”hibernate_sequence”。 



5,高低位演算法 

<id name=”id” column=”id”> 

<generator class=”hilo”> 

<param name=”table”>high_value</param> 

<!–設定高位值取值的表–> 

<param name=”column”>next_value</param> 

<!–設定高位值取值的欄位–> 

<param name=”max_lo”>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 name=”Car” table=”car_pk”> 

<id name=”id” column=”id” type=”integer”> 

<generator class=”native” /> 

</id> 

<property name=”name” column=”name” type=”string” /> 

<one-to-one name=”engine” class=”Engine” cascade=”all”/> 

</class> 

注:cascade=”all” 表示增刪改查Car物件時都會級聯增加、刪除和修改Engine物件。 

級聯一定是在主物件的對映檔案中 


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

<class name=”Engine” table=”engine_pk”> 

<id name=”id” column=”id” type=”integer”> 

<generator class=”foreign”> 

<param name=”property”>car</param> 

</generator> 

</id> 

<property name=”model” column=”model” type=”string” /> 

<one-to-one name=”car” class=”Car” c/> 

</class> 

注:c表示Engine應用了Car的主健作為外健。 

foregin表明id的生成方式是引用表car的主鍵 


B、外健對映:主表中用one-to-one,通過property -ref many-to-one 

a、主表Car.hbm.xml的寫法 

<class name=”Car” table=”car_fk”> 

<id name=”id” column=”id” type=”integer”> 

<generator class=”native” /> 

</id> 

<property name=”name” column=”name” type=”string” /> 

<one-to-one name=”engine” class=”Engine” 

property-ref=”car” cascade=”save-update”/> 

</class> 

注:name=”engine” property-ref=”car”表示engine表引用了car表的主健作為他的外健。 

cascade=”save-update”表示增改Car物件時都會級聯增加和修改Engine物件。 


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

<class name=”Engine” table=”engine_fk”> 

<id name=”id” column=”id” type=”integer”> 

<generator class=”native” /> 

</id> 

<property name=”model” column=”model” type=”string” /> 

<many-to-one name=”car” class=”Car” 

unique=”ture”  column=”carid”/> 

</class> 

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


相關文章