hibernate generator class="" id詳解

「assigned」 
  
主鍵由外部程序負責生成,在   save()   以前指定一個。   
    
  
「hilo」 
  
經過hi/lo   算法實現的主鍵生成機制,須要額外的數據庫表或字段提供高位值來源。    
    
  
「seqhilo」 
  
與hilo   相似,經過hi/lo   算法實現的主鍵生成機制,須要數據庫中的   Sequence,適用於支持   Sequence   的數據庫,如Oracle。    
    
  
「increment」 
  
主鍵按數值順序遞增。此方式的實現機制爲在當前應用實例中維持一個變量,以保存着當前的最大值,以後每次須要生成主鍵的時候將此值加1做爲主鍵。這種方式可能產生的問題是:不能在集羣下使用。    
    
  
「identity」 
  
採用數據庫提供的主鍵生成機制。如DB二、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>聯合一塊兒使用。java

1、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 
在一個會話中保存多個對象 
2、Hibernate中對類關係的處理: 
one―to―one關係在數據庫中如何體現,在JavaBean中如何體現,在 
Hibernate中如何映射one-to-one關係。            
一、 數據庫中:一個表的外健對應另外一個表的主健,外健要加上Unique約束(外健關聯)。或者是兩個表共享一個主健,表現爲子表中的pk同時引用了父表的pk做外健而存在(主健關聯,子表中的pk和fk爲一個字段)。 
二、 javaBean中:在JavaBean中增長一個屬性,即另一個對象的引用,能夠單向也能夠雙向。 
三、 在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加上惟一約束,使之一對多關係強制轉化爲一對一關係。算法

http://www.cnblogs.com/gywbg --------------GYW
相關文章
相關標籤/搜索