第7章hibernate的映射關(guān)系詳解_第1頁
第7章hibernate的映射關(guān)系詳解_第2頁
第7章hibernate的映射關(guān)系詳解_第3頁
第7章hibernate的映射關(guān)系詳解_第4頁
第7章hibernate的映射關(guān)系詳解_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

對(duì)象/關(guān)系映射—Hibernate第二章本章目標(biāo)學(xué)習(xí)Hibernate的映射申明(Mappingdeclaration)理解持久化對(duì)象的狀態(tài)和生命周期映射聲明(Mappingdeclaration)

對(duì)象和關(guān)系數(shù)據(jù)庫之間的映射是用一個(gè)XML文檔(XMLdocument)來定義的。這個(gè)映射文檔被設(shè)計(jì)為易讀的,并且可以手工修改。映射語言是以Java為中心的,意味著映射是按照持久化類的定義來創(chuàng)建的,而非表的定義。

請(qǐng)注意,雖然很多Hibernate用戶選擇手工定義XML映射文檔,也有一些工具來生成映射文檔,包括XDoclet,Middlegen和AndroMDA.hibernate-mapping

一、類層次。class 1、主鍵。id 2、基本類型。property 3、自定義類。many-to-one|one-to-one 4、集合。set|list|map|array 4.1、one-to-many 4.2、many-to-many 5、子類。subclass|joined-subclass 6、其它。component|any等

二、查詢語句。Query說明:一個(gè)Hibernate-mapping中可以同時(shí)定義多個(gè)類。Query非常簡(jiǎn)單,主要是用來放置查詢語句,便于對(duì)數(shù)據(jù)庫查詢的統(tǒng)一管理和優(yōu)化。<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD2.0//EN"""><hibernate-mappingpackage="eg"> <classname="Cat"table="CATS"discriminator-value="C"> <idname="id"column="uid"type="long"><generatorclass="hilo"/></id> <discriminatorcolumn="subclass"type="character"/> <propertyname="birthdate"type="date"/> <propertyname="color"not-null="true"/> <propertyname="sex"not-null="true"update="false"/> <propertyname="weight"/> <many-to-onename="mate"column="mate_id"/> <setname="kittens"><keycolumn="mother_id"/> <one-to-manyclass="Cat"/> </set> <subclassname="DomesticCat"discriminator-value="D"> <propertyname="name"type="string"/></subclass> </class> <classname="Dog"> <!--mappingforDogcouldgohere--> </class></hibernate-mapping>這是一個(gè)樣例以此我們來進(jìn)行學(xué)習(xí)Doctype所有的XML映射都需要定義如上所示的doctype。DTD可以從上述URL中獲取,或者在hibernate-x.x.x/src/net/sf/hibernate目錄中,或hibernate.jar文件中找到。Hibernate總是會(huì)在它的classptah中首先搜索DTD文件。hibernate-mapping這個(gè)元素包括三個(gè)可選的屬性。schema屬性,指明了這個(gè)映射所引用的表所在的schema名稱。假若指定了這個(gè)屬性,表名會(huì)加上所指定的schema的名字?jǐn)U展為全限定名。假若沒有指定,表名就不會(huì)使用全限定名。default-cascade指定了未明確注明cascade屬性的Java屬性和集合類Java會(huì)采取什么樣的默認(rèn)級(jí)聯(lián)風(fēng)格。auto-import屬性默認(rèn)讓我們?cè)诓樵冋Z言中可以使用非全限定名的類名。<hibernate-mappingschema="schemaName"(1) default-cascade="none|save-update"(2) auto-import="true|false" (3) package="" (4)/>(1)schema(可選):數(shù)據(jù)庫schema名稱(2)default-cascade(可選-默認(rèn)為none):默認(rèn)的級(jí)聯(lián)風(fēng)格(3)auto-import(可選-默認(rèn)為true):指定是否我們可以在查詢語言中使用非全限定的類名(僅限于本映射文件中的類)。(4)package(可選):指定一個(gè)包前綴,如果在映射文檔中沒有指定全限定名,就使用這個(gè)包名。假若你有兩個(gè)持久化類,它們的非全限定名是一樣的(就是在不同的包里面--譯者注),你應(yīng)該設(shè)置auto-import="false"。假若說你把一個(gè)“import過”的名字同時(shí)對(duì)應(yīng)兩個(gè)類,Hibernate會(huì)拋出一個(gè)異常。hibernate-mapping

類層次class你可以使用class元素來定義一個(gè)持久化類:

<classname="ClassName"(1)table="tableName"(2)

discriminator-value="discriminator_value"(3)mutable="true|false"(4)schema="owner"(5)

proxy="ProxyInterface"(6)dynamic-update="true|false"(7)

dynamic-insert="true|false"(8)select-before-update="true|false"(9)polymorphism="implicit|explicit"(10)where="arbitrarysqlwherecondition"(11)

persister="PersisterClass"(12)batch-size="N"(13)optimistic-lock="none|version|dirty|all"(14)

lazy="true|false"(15)/>類層次class(1)name:持久化類(或者接口)的Java全限定名。(2)table:對(duì)應(yīng)的數(shù)據(jù)庫表名。(3)discriminator-value(辨別值)(可選-默認(rèn)和類名一樣):一個(gè)用于區(qū)分不同的子類的值,在多態(tài)行為時(shí)使用。(4)mutable(可變)(可選,默認(rèn)值為true):表明該類的實(shí)例可變(不可變)。(5)schema(可選):覆蓋在根<hibernate-mapping>元素中指定的schema名字。(6)proxy(可選):指定一個(gè)接口,在延遲裝載時(shí)作為代理使用。你可以在這里使用該類自己的名字。(7)dynamic-update(動(dòng)態(tài)更新)(可選,默認(rèn)為false):指定用于UPDATE的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只更新那些改變過的字段。(8)dynamic-insert(動(dòng)態(tài)插入)(可選,默認(rèn)為false):指定用于INSERT的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只包含那些非空值字段。類層次class(9)select-before-update(可選,默認(rèn)值為false):指定Hibernate除非確定對(duì)象的確被修改了,不會(huì)執(zhí)行SQLUPDATE操作。在特定場(chǎng)合(實(shí)際上,只會(huì)發(fā)生在一個(gè)臨時(shí)對(duì)象關(guān)聯(lián)到一個(gè)新的session中去,執(zhí)行update()的時(shí)候),這說明Hibernate會(huì)在UPDATE之前執(zhí)行一次額外的SQLSELECT操作,來決定是否應(yīng)該進(jìn)行UPDATE。(10)polymorphism(多形,多態(tài))(可選,默認(rèn)值為implicit(隱式)):界定是隱式還是顯式的使用查詢多態(tài)。(11)where(可選)指定一個(gè)附加的SQLWHERE條件,在抓取這個(gè)類的對(duì)象時(shí)會(huì)一直增加這個(gè)條件。(12)persister(可選):指定一個(gè)定制的ClassPersister。(13)batch-size(可選,默認(rèn)是1)指定一個(gè)用于根據(jù)標(biāo)識(shí)符抓取實(shí)例時(shí)使用的“batchsize”(批次抓取數(shù)量)。(14)optimistic-lock(樂觀鎖定)(可選,默認(rèn)是version):決定樂觀鎖定的策略。(15)lazy(延遲)(可選):假若設(shè)置lazy="true",就是設(shè)置這個(gè)類自己的名字作為proxy接口的一種等價(jià)快捷形式。主鍵-id被映射的類必須聲明對(duì)應(yīng)數(shù)據(jù)庫表主鍵字段。大多數(shù)類有一個(gè)JavaBeans風(fēng)格的屬性,為每一個(gè)實(shí)例包含唯一的標(biāo)識(shí)。<id>元素定義了該屬性到數(shù)據(jù)庫表主鍵字段的映射。

<idname="propertyName"(1)type="typename"(2)column="column_name"(3)unsaved-value="any|none|null|id_value"(4)access="field|property|ClassName">(5)<generatorclass="generatorClass"/></id>主鍵-id(1)name(可選):標(biāo)識(shí)屬性的名字。(2)type(可選):標(biāo)識(shí)Hibernate類型的名字。(3)column(可選-默認(rèn)為屬性名):主鍵字段的名字。(4)unsaved-value(可選-默認(rèn)為null):一個(gè)特定的標(biāo)識(shí)屬性值,用來標(biāo)志該實(shí)例是剛剛創(chuàng)建的,尚未保存。這可以把這種實(shí)例和從以前的session中裝載過(可能又做過修改--譯者注)但未再次持久化的實(shí)例區(qū)分開來。(5)access(可選-默認(rèn)為property):Hibernate用來訪問屬性值的策略。如果name屬性不存在,會(huì)認(rèn)為這個(gè)類沒有標(biāo)識(shí)屬性。

unsaved-value屬性很重要!如果你的類的標(biāo)識(shí)屬性不是默認(rèn)為null的,你應(yīng)該指定正確的默認(rèn)值。還有一個(gè)另外的<composite-id>聲明可以訪問舊式的多主鍵數(shù)據(jù)。我們強(qiáng)烈不鼓勵(lì)使用這種方式。主鍵生成策略generator必須聲明的<generator>子元素是一個(gè)Java類的名字,用來為該持久化類的實(shí)例生成唯一的標(biāo)識(shí)。如果這個(gè)生成器實(shí)例需要某些配置值或者初始化參數(shù),用<param>元素來傳遞。

<idname="id"type="long"column="uid"unsaved-value="0"> <generatorclass="net.sf.hibernate.id.TableHiLoGenerator"> <paramname="table">uid_table</param> <paramname="column">next_hi_value_column</param></generator></id>所有的生成器都實(shí)現(xiàn)net.sf.hibernate.id.IdentifierGenerator接口

Hibernate內(nèi)置的主鍵生成策略increment(遞增)

用于為long,short或者int類型生成唯一標(biāo)識(shí)。只有在沒有其他進(jìn)程往同一張表中插入數(shù)據(jù)時(shí)才能使用。在集群下不要使用。

identity

對(duì)DB2,MySQL,MSSQLServer,Sybase和HypersonicSQL的內(nèi)置標(biāo)識(shí)字段提供支持。返回的標(biāo)識(shí)符是long,short或者int類型的。sequence(序列)

在DB2,PostgreSQL,Oracle,SAPDB,McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的標(biāo)識(shí)符是long,short或者int類型的。hilo(高低位)

使用一個(gè)高/低位算法來高效的生成long,short或者int類型的標(biāo)識(shí)符。給定一個(gè)表和字段(默認(rèn)分別是是hibernate_unique_key和next_hi)作為高位值得來源。高/低位算法生成的標(biāo)識(shí)符只在一個(gè)特定的數(shù)據(jù)庫中是唯一的。在使用JTA獲得的連接或者用戶自行提供的連接中,不要使用這種生成器。

Hibernate內(nèi)置的主鍵生成策略seqhilo(使用序列的高低位)

使用一個(gè)高/低位算法來高效的生成long,short或者int類型的標(biāo)識(shí)符,給定一個(gè)數(shù)據(jù)庫序列(sequence)的名字。uuid.hex

用一個(gè)128-bit的UUID算法生成字符串類型的標(biāo)識(shí)符。在一個(gè)網(wǎng)絡(luò)中唯一(使用了IP地址)。UUID被編碼為一個(gè)32位16進(jìn)制數(shù)字的字符串。uuid.string

使用同樣的UUID算法。UUID被編碼為一個(gè)16個(gè)字符長(zhǎng)的任意ASCII字符組成的字符串。不能使用在PostgreSQL數(shù)據(jù)庫中

native(本地)

根據(jù)底層數(shù)據(jù)庫的能力選擇identity,sequence或者h(yuǎn)ilo中的一個(gè)。assigned(程序設(shè)置)

讓應(yīng)用程序在save()之前為對(duì)象分配一個(gè)標(biāo)示符。foreign(外部引用)

使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。和<one-to-one>聯(lián)合一起使用?;绢愋停璸roperty<property>元素為類聲明了一個(gè)持久化的,JavaBean風(fēng)格的屬性。

<propertyname="propertyName"(1)column="column_name"(2)type="typename"(3)update="true|false"(4)insert="true|false"(4)formula="arbitrarySQLexpression"(5)access="field|property|ClassName"(6)/>基本類型-property(1)name:屬性的名字,以小寫字母開頭。

(2)column(可選-默認(rèn)為屬性名字):對(duì)應(yīng)的數(shù)據(jù)庫字段名。(3)type(可選):一個(gè)Hibernate類型的名字。

(4)update,insert(可選-默認(rèn)為true):表明在用于UPDATE和/或INSERT的SQL語句中是否包含這個(gè)字段。這二者如果都設(shè)置為false則表明這是一個(gè)“外源性(derived)”的屬性,它的值來源于映射到同一個(gè)(或多個(gè))字段的某些其他屬性,或者通過一個(gè)trigger(觸發(fā)器),或者其他程序。

(5)formula(可選):一個(gè)SQL表達(dá)式,定義了這個(gè)計(jì)算(computed)屬性的值。計(jì)算屬性沒有和它對(duì)應(yīng)的數(shù)據(jù)庫字段。(6)access(可選-默認(rèn)值為property):Hibernate用來訪問屬性值的策略。typename可以是如下幾種:Hibernate基礎(chǔ)類型之一(比如:integer,string,character,date,timestamp,float,binary,serializable,object,blob)。一個(gè)Java類的名字,這個(gè)類屬于一種默認(rèn)基礎(chǔ)類型(比如:int,float,char,java.lang.String,java.util.Date,java.lang.Integer,java.sql.Clob)。一個(gè)PersistentEnum的子類的名字。(比如:.eg.Color)。

一個(gè)可以序列化的Java類的名字。一個(gè)自定義類型的類的名字。(比如:com.illflow.type.MyCustomType)?;绢愋停璸roperty如果你沒有指定類型,Hibernarte會(huì)使用反射來得到這個(gè)名字的屬性,以此來猜測(cè)正確的Hibernate類型。Hibernate會(huì)對(duì)屬性讀取器(getter方法)的返回類進(jìn)行解釋,按照規(guī)則2,3,4的順序。然而,這并不足夠。在某些情況下你仍然需要type屬性。(比如,為了區(qū)別Hibernate.DATE和Hibernate.TIMESTAMP,或者為了指定一個(gè)自定義類型。)access屬性用來讓你控制Hibernate如何在運(yùn)行時(shí)訪問屬性。在默認(rèn)情況下,Hibernate會(huì)使用屬性的get/set方法對(duì)。如果你指明access="field",Hibernate會(huì)忽略get/set方法對(duì),直接使用反射來訪問成員變量。你也可以指定你自己的策略,這就需要你自己實(shí)現(xiàn)perty.PropertyAccessor接口,再在access中設(shè)置你自定義策略類的名字?;绢愋停璸roperty自定義類-many-to-one通過many-to-one元素,可以定義一種常見的與另一個(gè)持久化類的關(guān)聯(lián)。這種關(guān)系模型是多對(duì)一關(guān)聯(lián)。(實(shí)際上是一個(gè)對(duì)象引用。)

<many-to-onename="propertyName"(1)column="column_name"(2)class="ClassName"(3)cascade="all|none|save-update|delete"(4)outer-join="true|false|auto"(5)update="true|false"(6)insert="true|false"(6)property-ref="propertyNameFromAssociatedClass"(7)access="field|property|ClassName"(8)/>

自定義類-many-to-one(1)name:屬性名。(2)column(可選):字段名。(3)class(可選-默認(rèn)是通過反射得到屬性類型):關(guān)聯(lián)的類的名字。(4)cascade(級(jí)聯(lián))(可選):指明哪些操作會(huì)從父對(duì)象級(jí)聯(lián)到關(guān)聯(lián)的對(duì)象

(5)outer-join(外連接)(可選-默認(rèn)為自動(dòng)):當(dāng)設(shè)置Hibernate.use_outer_join的時(shí)候,對(duì)這個(gè)關(guān)聯(lián)允許外連接抓取。(6)update,insert(可選-defaultstotrue)指定對(duì)應(yīng)的字段是否在用于UPDATE和/或INSERT的SQL語句中包含。如果二者都是false,則這是一個(gè)純粹的“外源性(derived)”關(guān)聯(lián),它的值是通過映射到同一個(gè)(或多個(gè))字段的某些其他屬性得到的,或者通過trigger(除法器),或者是其他程序。自定義類-many-to-one(7)property-ref:(可選)指定關(guān)聯(lián)類的一個(gè)屬性,這個(gè)屬性將會(huì)和本外鍵相對(duì)應(yīng)。如果沒有指定,會(huì)使用對(duì)方關(guān)聯(lián)類的主鍵。(8)access(可選-默認(rèn)是property):Hibernate用來訪問屬性的策略。cascade屬性允許下列值:all,save-update,delete,none。設(shè)置除了none以外的其它值會(huì)傳播特定的操作到關(guān)聯(lián)的(子)對(duì)象中。參見后面的“LifecycleObjects(自動(dòng)管理生命周期的對(duì)象)”。outer-join參數(shù)允許下列三個(gè)不同值:auto(默認(rèn))使用外連接抓取關(guān)聯(lián)(對(duì)象),如果被關(guān)聯(lián)的對(duì)象沒有代理(proxy)true一直使用外連接來抓取關(guān)聯(lián)false永遠(yuǎn)不使用外連接來抓取關(guān)聯(lián)一個(gè)典型的簡(jiǎn)單many-to-one聲明例子:

<many-to-onename="product"class="Product"column="PRODUCT_ID"/> property-ref屬性只應(yīng)該用來對(duì)付老舊的數(shù)據(jù)庫系統(tǒng),可能出現(xiàn)外鍵指向?qū)Ψ疥P(guān)聯(lián)表的是個(gè)非主鍵字段(但是應(yīng)該是一個(gè)惟一關(guān)鍵字)的情況。這是一種十分丑陋的關(guān)系模型。比如說,假設(shè)Product類有一個(gè)惟一的序列號(hào),它并不是主鍵。(unique屬性控制Hibernate通過SchemaExport工具生成DDL的過程。)<propertyname="serialNumber"unique="true"type="string"column="SERIAL_NUMBER"/>那么關(guān)于OrderItem的映射可能是:<many-to-onename="product"property-ref="serialNumber"column="PRODUCT_SERIAL_NUMBER"/>當(dāng)然,我們決不鼓勵(lì)這種用法。例子:User-Group<classname="com.test.hibernate.User"table="TBL_USER"> <idname="id"column="userId"><generatorclass="native"/></id>

<many-to-onename=“group”column=“groupId”outer-join="false"/></class><classname="com.test.hibernate.Group"table="TBL_GROUP"> <idname="id"column="groupId"><generatorclass="native"/></id></class>自定義類-one-to-one持久化對(duì)象之間一對(duì)一的關(guān)聯(lián)關(guān)系是通過one-to-one元素定義的

<one-to-onename="propertyName"(1)class="ClassName"(2)cascade="all|none|save-update|delete"(3)constrained="true|false"(4)outer-join="true|false|auto"(5)property-ref="propertyNameFromAssociatedClass"(6)access="field|property|ClassName"(7)/>自定義類-one-to-one(1)name:屬性的名字。(2)class(可選-默認(rèn)是通過反射得到的屬性類型):被關(guān)聯(lián)的類的名字

(3)cascade(級(jí)聯(lián))(可選)表明操作是否從父對(duì)象級(jí)聯(lián)到被關(guān)聯(lián)的對(duì)象。

(4)constrained(約束)(可選)表明該類對(duì)應(yīng)的表對(duì)應(yīng)的數(shù)據(jù)庫表,和被關(guān)聯(lián)的對(duì)象所對(duì)應(yīng)的數(shù)據(jù)庫表之間,通過一個(gè)外鍵引用對(duì)主鍵進(jìn)行約束。這個(gè)選項(xiàng)影響save()和delete()在級(jí)聯(lián)執(zhí)行時(shí)的先后順序(也在schemaexporttool中被使用)。(5)outer-join(外連接)(可選-默認(rèn)為自動(dòng)):當(dāng)設(shè)置hibernate.use_outer_join的時(shí)候,對(duì)這個(gè)關(guān)聯(lián)允許外連接抓取。

(6)property-ref:(可選)指定關(guān)聯(lián)類的一個(gè)屬性,這個(gè)屬性將會(huì)和本外鍵相對(duì)應(yīng)。如果沒有指定,會(huì)使用對(duì)方關(guān)聯(lián)類的主鍵。

(7)access(可選-默認(rèn)是property):Hibernate用來訪問屬性的策略。自定義類-one-to-one有兩種不同的一對(duì)一關(guān)聯(lián):主鍵關(guān)聯(lián)惟一外鍵關(guān)聯(lián)

主鍵關(guān)聯(lián)不需要額外的表字段;兩行是通過這種一對(duì)一關(guān)系相關(guān)聯(lián)的,那么這兩行就共享同樣的主關(guān)鍵字值。所以如果你希望兩個(gè)對(duì)象通過主鍵一對(duì)一關(guān)聯(lián),你必須確認(rèn)它們被賦予同樣的標(biāo)識(shí)值!例子:User-IdCard(外鍵關(guān)聯(lián))<classname="com.test.hibernate.User"table="TBL_USER"> <idname="id"column="userId"><generatorclass="native"/></id>

<many-to-onename=“idCard”column=“idCardId”outer-join="false“

unique=“true”/></class><classname="com.test.hibernate.IdCard"table="TBL_IDCARD"> <idname="id"column="idCardId"><generatorclass="native"/></id></class>集合類(Collections)映射

Hibernate可以持久化以下java集合的實(shí)例,包括java.util.Map,java.util.Set,java.util.SortedMap,java.util.SortedSet,java.util.List,和任何持久實(shí)體或值的數(shù)組。類型為java.util.Collection或者java.util.List的屬性還可以使用“bag”語義來持久。警告:用于持久化的集合,除了集合接口外,不能保留任何實(shí)現(xiàn)這些接口的類所附加的語義(例如:LinkedHashSet帶來的迭代順序)。所有的持久化集合,實(shí)際上都各自按照HashMap,HashSet,TreeMap,TreeSet和ArrayList的語義直接工作。更深入地說,對(duì)于一個(gè)包含集合的屬性來說,必須把Java類型定義為接口(也就是Map,Set或者List等),而絕不能是HashMap,TreeSet或者ArrayList。存在這個(gè)限制的原因是,在你不知道的時(shí)候,Hibernate暗中把你的Map,Set和List的實(shí)例替換成了它自己的關(guān)于Map,Set或者List的實(shí)現(xiàn)。(所以在你的程序中,謹(jǐn)慎使用==操作符。)

映射集合(MappingaCollection)

在Hibernate配置文件中使用<set>,<list>,<map>,<bag>,<array>和<primitive-array>等元素來定義集合,而<map>是最典型的一個(gè)。

<mapname="propertyName"(1)table="table_name"(2)schema="schema_name"(3)lazy="true|false"(4)inverse="true|false"(5)cascade="all|none|save-update|delete|all-delete-orphan"(6)sort="unsorted|natural|comparatorClass"(7)order-by="column_nameasc|desc"(8)where="arbitrarysqlwherecondition"(9)outer-join="true|false|auto"(10)batch-size="N"(11)access="field|property|ClassName"(12)><key..../><index..../><element..../></map>映射集合(MappingaCollection)(1)name集合屬性的名稱

(2)table(可選——默認(rèn)為屬性的名稱)這個(gè)集合表的名稱(不能在一對(duì)多的關(guān)聯(lián)關(guān)系中使用)(3)schema(可選)表的schema的名稱,他將覆蓋在根元素中定義的schema(4)lazy(可選——默認(rèn)為false)lazy(可選--默認(rèn)為false)允許延遲加載(lazyinitialization)(不能在數(shù)組中使用)

(5)inverse(可選——默認(rèn)為false)標(biāo)記這個(gè)集合作為雙向關(guān)聯(lián)關(guān)系中的方向一端

(6)cascade(可選——默認(rèn)為none)讓操作級(jí)聯(lián)到子實(shí)體映射集合(MappingaCollection)(7)sort(可選)指定集合的排序順序,其可以為自然的(natural)或者給定一個(gè)用來比較的類。(8)order-by(可選,僅用于jdk1.4)指定表的字段(一個(gè)或幾個(gè))再加上asc或者desc(可選),定義Map,Set和Bag的迭代順序(9)where(可選)指定任意的SQLwhere條件,該條件將在重新載入或者刪除這個(gè)集合時(shí)使用(當(dāng)集合中的數(shù)據(jù)僅僅是所有可用數(shù)據(jù)的一個(gè)子集時(shí)這個(gè)條件非常有用)(10)outer-join(可選)指定這個(gè)集合,只要可能,應(yīng)該通過外連接(outerjoin)取得。在每一個(gè)SQL語句中,只能有一個(gè)集合可以被通過外連接抓取(11)batch-size(可選,默認(rèn)為1)指定通過延遲加載取得集合實(shí)例的批處理塊大小(“batchsize”)。(12)access(可選-默認(rèn)為屬性property):Hibernate取得屬性值時(shí)使用的策略映射集合(MappingaCollection)建立列表(List)和數(shù)組(Array)需要一個(gè)單獨(dú)表字段用來保存列表(List)或數(shù)組(Array)的索引(foo[i]中的i)。Hibernate集合嚴(yán)格遵守Set,List和Map接口中包涵的自然語義。List元素不能正確的自發(fā)對(duì)他們自己進(jìn)行排序!bag是一個(gè)無序,沒有索引的集合并且可能包含多個(gè)相同的元素。在Java集合框架中沒有Bag接口,但是你必須用List模擬它。Hibernate允許你映射類型為L(zhǎng)ist或者Collection的屬性到<bag>元素。注意:具有inverse="false"標(biāo)記的大型Hibernatebag效率是相當(dāng)?shù)偷?,?yīng)該盡量避免。Hibernate無法創(chuàng)建,刪除和更新它的單個(gè)記錄,因?yàn)樗麄儧]有關(guān)鍵字來識(shí)別單個(gè)記錄。

one-to-many概念:一對(duì)多關(guān)聯(lián)直接連接兩個(gè)類對(duì)應(yīng)的表,而沒有中間集合表。(實(shí)現(xiàn)了一個(gè)一對(duì)多的關(guān)系模型,例如:User-Address)這里的Java集合必須滿足下面的語義:map,set或list中不能包含null值一個(gè)被包含的實(shí)體的實(shí)例只能被包含在一個(gè)集合的實(shí)例中<one-to-manyclass="ClassName"/>(1)class(必須):被關(guān)聯(lián)類的名稱。例子(one-to-many):User-Address<classname="com.test.hibernate.User"table="TBL_USER"> <idname="id"column="userId"><generatorclass="native"/></id>

<setname="addresses"lazy="true"cascade="all"> <keycolumn="addressId"/> <one-to-manyclass="com.test.hibernate.Address"/> </set> </class><classname="com.test.hibernate.Address"table="TBL_ADDRESS"> <idname="id"column="addressId"><generatorclass="native"/></id> </class>many-to-many<many-to-manycolumn="column_name"(1)class="ClassName"(2)outer-join="true|false|auto"(3)/>(1)column(必需):中間映射表中,關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段(2)class(必需):類名,關(guān)聯(lián)目標(biāo)類(3)outer-join(可選-默認(rèn)為auto)<keycolumn="column_name"/> (1)(1)column(必需):當(dāng)前表的關(guān)聯(lián)字段例子(manytomany):student-trainClass<classname="com.test.hibernate.Student"> <idname="id"column="userId"><generatorclass="native"/></id> <setname="trainClasses"lazy="true"cascade="save-update"> <keycolumn="studentId"/> <many-to-manyclass="com.test.hibernate.TrainClass" column="trainClassId"/> </set></class><classname="com.test.hibernate.TrainClass"table="TBL_TRAIN_CLASS"> <idname="id"column="trainClassId"><generatorclass="native"/></id></class>繼承繼承實(shí)現(xiàn)的三中策略單表繼承。每棵類繼承樹使用一個(gè)表(tableperclasshierarchy)具體表繼承。每個(gè)子類一個(gè)表(tablepersubclass)類表繼承。每個(gè)具體類一個(gè)表(tableperconcreteclass)(有一些限制)單表繼承<discriminatorcolumn="discriminator_column"(1)type="discriminator_type"(2)/><subclass>例子(繼承):user-student<classname="com.test.hibernate.User"table="TBL_USER"> <idname="id"column="userId"> <generatorclass="native"/> </id>

<discriminatortype="string"column="inherit"/>

<subclassname="com.test.hibernate.Student"> <propertyname="number"column="studentNumber"/> </subclass> </class>雙向關(guān)聯(lián)概念:雙向關(guān)聯(lián)允許通過關(guān)聯(lián)的任一端訪問另外一端。在Hibernate中,支持兩種類型的雙向關(guān)聯(lián)。一對(duì)多(one-to-many),Set或者bag值在一端,單獨(dú)值(非集合)在另外一端。多對(duì)多(many-to-many),兩端都是set或bag值。例子(雙向關(guān)聯(lián)):group-user<classname="com.test.hibernate.Group"table="TBL_GROUP"> <idname="id"column="groupId"><generatorclass="native“></id>

<setname="users"lazy="true"cascade="save-update"inverse="true"> <keycolumn="groupId"/> <one-to-manyclass="com.test.hibernate.User"/> </set></class><classname="com.test.hibernate.User"table="TBL_USER"> <idname="id"column="userId"><generatorclass="native"/></id>

<many-to-onename="group"column="groupId

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論