hibernate generator class="" id詳解 (轉)


“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加上唯一約束,使之一對多關系強制轉化為一對一關系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM