hibernateid屬性generatorclass=””詳解
原文來自: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加上唯一約束,使之一對多關係強制轉化為一對一關係。
相關文章
- display屬性詳解
- cookie屬性詳解Cookie
- CSS字型屬性和文字屬性詳解CSS
- CSS定位屬性詳解CSS
- background屬性用法詳解
- UITableView 屬性用法詳解UIView
- css display屬性詳解CSS
- HTML——② HTML 元素、屬性詳解HTML
- z-index屬性詳解Index
- Android屬性動畫詳解(一),屬性動畫基本用法Android動畫
- After Effects 圖層屬性及屬性組結構詳解
- Python - __slots__屬性詳解Python
- 屬性配置檔案詳解(2)
- Flutter GetX Tag 屬性使用詳解Flutter
- Rust中的derive屬性詳解Rust
- display的flex屬性使用詳解Flex
- Android 佈局屬性詳解Android
- Android taskAffinity屬性使用詳解Android
- PB TreeView 屬性,事件詳解(轉)View事件
- css3中transition屬性詳解CSSS3
- Meta http-equiv屬性詳解(轉)HTTPUI
- Flutter 入門 — Container 屬性詳解FlutterAI
- fill-opacity屬性用法詳解
- iOS- 詳解文字屬性AttributesiOS
- Android圖文詳解屬性動畫Android動畫
- npm package.json屬性詳解NPMPackageJSON
- 【轉】android佈局屬性詳解Android
- Vue — 計算屬性(computed)詳解Vue
- JS 陣列(Arrey)屬性以及方法詳解JS陣列
- vue計算屬性詳解——小白速會Vue
- logstash-input-file 配置屬性詳解
- CSS border-width屬性用法詳解CSS
- CSS3的content屬性詳解CSSS3
- Python進階之“屬性(property)”詳解Python
- Android中visibility屬性詳解Android
- Android---Android:windowSoftInputMode屬性詳解AndroidWindows
- 應用程式池屬性詳解及配置
- 提高班1:ImageView中ScaleType屬性詳解,配圖詳解View