id標(biāo)簽
被映射的類必須聲明對應(yīng)數(shù)據(jù)庫表主鍵字段。大多數(shù)類有一個JavaBeans風(fēng)格的屬性,,為每一個實(shí)例包含唯一的標(biāo)識。<id> 元素定義了該屬性到數(shù)據(jù)庫表主鍵字段的映射,。 <id name="propertyName" type="typename" column="column_name" unsaved-value="any|none|null|id_value" access="field|property|ClassName"> <generator class="generatorClass"/> </id> name (可選): 標(biāo)識屬性的名字。 type (可選): 標(biāo)識Hibernate類型的名字,。 column (可選 - 默認(rèn)為屬性名): 主鍵字段的名字,。 unsaved-value (可選 - 默認(rèn)為null): 一個特定的標(biāo)識屬性值,用來標(biāo)志該實(shí)例是剛剛創(chuàng)建的,,尚未保存,。這可以把這種實(shí)例和從以前的session中裝載過(可能又做過修改--譯者注)但未再次持久化的實(shí)例區(qū)分開來。 access (可選 - 默認(rèn)為property): Hibernate用來訪問屬性值的策略,。 如果 name屬性不存在,,會認(rèn)為這個類沒有標(biāo)識屬性。 unsaved-value 屬性很重要,!如果你的類的標(biāo)識屬性不是默認(rèn)為null的,,你應(yīng)該指定正確的默認(rèn)值。 還有一個另外的<composite-id>聲明可以訪問舊式的多主鍵數(shù)據(jù),。我們強(qiáng)烈不鼓勵使用這種方式,。 1. generator 必須聲明的<generator>子元素是一個Java類的名字,用來為該持久化類的實(shí)例生成唯一的標(biāo)識,。如果這個生成器實(shí)例需要某些配置值或者初始化參數(shù),,用<param>元素來傳遞,。 <id name="id" type="long" column="uid" unsaved-value="0"> <generator class="net.sf.hibernate.id.TableHiLoGenerator"> <param name="table">uid_table</param> <param name="column">next_hi_value_column</param> </generator> </id> 所有的生成器都實(shí)現(xiàn)net.sf.hibernate.id.IdentifierGenerator接口,。這是一個非常簡單的接口;某些應(yīng)用程序可以選擇提供他們自己特定的實(shí)現(xiàn),。當(dāng)然,,Hibernate提供了很多內(nèi)置的實(shí)現(xiàn),。下面是一些內(nèi)置生成器的快捷名字: increment(遞增) 用于為long, short或者int類型生成唯一標(biāo)識。只有在沒有其他進(jìn)程往同一張表中插入數(shù)據(jù)時才能使用,。 在集群下不要使用,。 identity 對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內(nèi)置標(biāo)識字段提供支持。返回的標(biāo)識符是long, short 或者int類型的,。 sequence (序列) 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),,而在Interbase中使用生成器(generator)。返回的標(biāo)識符是long, short或者 int類型的,。 hilo (高低位) 使用一個高/低位算法來高效的生成long, short或者 int類型的標(biāo)識符,。給定一個表和字段(默認(rèn)分別是是hibernate_unique_key 和next)作為高位值得來源。高/低位算法生成的標(biāo)識符只在一個特定的數(shù)據(jù)庫中是唯一的,。在使用JTA獲得的連接或者用戶自行提供的連接中,,不要使用這種生成器。 seqhilo(使用序列的高低位) 使用一個高/低位算法來高效的生成long, short或者 int類型的標(biāo)識符,,給定一個數(shù)據(jù)庫序列(sequence)的名字,。 uuid.hex 用一個128-bit的UUID算法生成字符串類型的標(biāo)識符。在一個網(wǎng)絡(luò)中唯一(使用了IP地址),。UUID被編碼為一個32位16進(jìn)制數(shù)字的字符串,。 uuid.string 使用同樣的UUID算法。UUID被編碼為一個16個字符長的任意ASCII字符組成的字符串,。不能使用在PostgreSQL數(shù)據(jù)庫中 native(本地) 根據(jù)底層數(shù)據(jù)庫的能力選擇identity, sequence 或者h(yuǎn)ilo中的一個,。 assigned(程序設(shè)置) 讓應(yīng)用程序在save()之前為對象分配一個標(biāo)示符。 foreign(外部引用) 使用另外一個相關(guān)聯(lián)的對象的標(biāo)識符,。和<one-to-one>聯(lián)合一起使用,。 2. 高/低位算法(Hi/Lo Algorithm) hilo 和 seqhilo生成器給出了兩種hi/lo算法的實(shí)現(xiàn),這是一種很令人滿意的標(biāo)識符生成算法,。第一種實(shí)現(xiàn)需要一個“特殊”的數(shù)據(jù)庫表來保存下一個可用的“hi”值,。第二種實(shí)現(xiàn)使用一個Oracle風(fēng)格的序列(在被支持的情況下)。 <id name="id" type="long" column="cat_id"> <generator class="hilo"> <param name="table">hi_value</param> <param name="column">next_value</param> <param name="max_lo">100</param> </generator> </id> <id name="id" type="long" column="cat_id"> <generator class="seqhilo"> <param name="sequence">hi_value</param> <param name="max_lo">100</param> </generator> </id> 很不幸,,你在為Hibernate自行提供Connection,,或者Hibernate使用JTA獲取應(yīng)用服務(wù)器的數(shù)據(jù)源連接的時候無法使用hilo 。Hibernate必須能夠在一個新的事務(wù)中得到一個"hi"值,。在EJB環(huán)境中實(shí)現(xiàn)hi/lo算法的標(biāo)準(zhǔn)方法是使用一個無狀態(tài)的session bean,。 3. UUID算法(UUID Algorithm ) UUID包含:IP地址,JVM的啟動時間(精確到1/4秒),,系統(tǒng)時間和一個計(jì)數(shù)器值(在JVM中唯一),。在Java代碼中不可能獲得MAC地址或者內(nèi)存地址,所以這已經(jīng)是我們在不使用JNI的前提下的能做的最好實(shí)現(xiàn)了。 不要試圖在PostgreSQL中使用uuid.string,。 4. 標(biāo)識字段和序列(Identity Columns and Sequences) 對于內(nèi)部支持標(biāo)識字段的數(shù)據(jù)庫(DB2,MySQL,Sybase,MS SQL),,你可以使用identity關(guān)鍵字生成。對于內(nèi)部支持序列的數(shù)據(jù)庫(DB2,Oracle, PostgreSQL, Interbase, McKoi,SAP DB),你可以使用sequence風(fēng)格的關(guān)鍵字生成,。這兩種方式對于插入一個新的對象都需要兩次SQL查詢,。 <id name="id" type="long" column="uid"> <generator class="sequence"> <param name="sequence">uid_sequence</param> </generator> </id> <id name="id" type="long" column="uid" unsaved-value="0"> <generator class="identity"/> </id> 對于跨平臺開發(fā),native策略會從identity, sequence 和hilo中進(jìn)行選擇,,取決于底層數(shù)據(jù)庫的支持能力,。 下面再給個簡單例子: <id name="id" type="long" column="uid"> <generator class="sequence"> <param name="sequence">uid_sequence</param> </genarator> </id> 注意: <generator class=""> 里面可以選啊!推薦Oracle用sequence,seqhilo |
|