




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章映射持久化類1classname(可選):持久化類(或者接口)的Java全限定名。如果這個(gè)屬性不存在,Hibernate將假定這是一個(gè)非POJO的實(shí)體映射。table(可選-默認(rèn)是類的非全限定名):對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名。discriminator-value(可選-默認(rèn)和類名一樣):一個(gè)用于區(qū)分不同的子類的值,在多態(tài)行為時(shí)使用。它可以接受的值包括null和notnull。mutable(可選,默認(rèn)值為true):表明該類的實(shí)例是可變的或者不可變的。schema(可選):覆蓋在根<hibernate-mapping>元素中指定的schema名字。2classcatalog(可選):覆蓋在根<hibernate-mapping>元素中指定的catalog名字。proxy(可選):指定一個(gè)接口,在延遲裝載時(shí)作為代理使用。你可以在這里使用該類自己的名字。dynamic-update(可選,默認(rèn)為false):指定用于UPDATE的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只更新那些改變過(guò)的字段。dynamic-insert(可選,默認(rèn)為false):指定用于INSERT的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只包含那些非空值字段。polymorphism(多態(tài))(可選,默認(rèn)值為implicit(隱式)):界定是隱式還是顯式的使用多態(tài)查詢(這只在Hibernate的具體表繼承策略中用到-譯注)。3classselect-before-update(可選,默認(rèn)為false):指定Hibernate除非確定對(duì)象真正被修改了(如果該值為true-譯注),否則不會(huì)執(zhí)行SQLUPDATE操作。在特定場(chǎng)合(實(shí)際上,它只在一個(gè)瞬時(shí)對(duì)象(transientobject)關(guān)聯(lián)到一個(gè)新的session中時(shí)執(zhí)行的update()中生效),這說(shuō)明Hibernate會(huì)在UPDATE之前執(zhí)行一次額外的SQLSELECT操作,來(lái)決定是否應(yīng)該執(zhí)行UPDATE。where(可選)指定一個(gè)附加的SQLWHERE條件,在抓取這個(gè)類的對(duì)象時(shí)會(huì)一直增加這個(gè)條件。persister(可選):指定一個(gè)定制的ClassPersister。batch-size(可選,默認(rèn)是1)指定一個(gè)用于根據(jù)標(biāo)識(shí)符(identifier)抓取實(shí)例時(shí)使用的"batchsize"(批次抓取數(shù)量)。4classoptimistic-lock(樂觀鎖定)(可選,默認(rèn)是version):決定樂觀鎖定的策略。lazy(可選):通過(guò)設(shè)置lazy=“false”,所有的延遲加載(Lazyfetching)功能將被全部禁用(disabled)。entity-name(可選,默認(rèn)為類名):Hibernate3允許一個(gè)類進(jìn)行多次映射(前提是映射到不同的表),并且允許使用Maps或XML代替Java層次的實(shí)體映射check(可選):這是一個(gè)SQL表達(dá)式,用于為自動(dòng)生成的schema添加多行(multi-row)約束檢查。rowid(可選):Hibernate可以使用數(shù)據(jù)庫(kù)支持的所謂的ROWIDs,例如:Oracle數(shù)據(jù)庫(kù),如果你設(shè)置這個(gè)可選的rowid,Hibernate可以使用額外的字段rowid實(shí)現(xiàn)快速更新。ROWID是這個(gè)功能實(shí)現(xiàn)的重點(diǎn),它代表了一個(gè)存儲(chǔ)元組(tuple)的物理位置。5classsubselect(可選):它將一個(gè)不可變(immutable)并且只讀的實(shí)體映射到一個(gè)數(shù)據(jù)庫(kù)的子查詢中。當(dāng)你想用視圖代替一張基本表的時(shí)候,這是有用的,但最好不要這樣做。abstract(可選):用于在<union-subclass>的繼承結(jié)構(gòu)(hierarchies)中標(biāo)識(shí)抽象超類。對(duì)Hibernate映射來(lái)說(shuō)視圖和表是沒有區(qū)別的,這是因?yàn)樗鼈冊(cè)跀?shù)據(jù)層都是透明的64.2.1理解Java同一性和等同性3種識(shí)別對(duì)象的方法:如果對(duì)象在JVM中占據(jù)著相同的內(nèi)存位置,它們就是同一的。這可以通過(guò)使用==操作符進(jìn)行檢查。這個(gè)概念稱作對(duì)象同一性。如果對(duì)象有著相同的值,它們就是相等的,如equals(Objecto)方法定義的一樣。不顯示覆蓋這個(gè)方法的類,繼承了由java.lang.Object定義的實(shí)現(xiàn),它比較對(duì)象同一性。這個(gè)概念稱作等同性。如果存儲(chǔ)在一個(gè)關(guān)系數(shù)據(jù)庫(kù)中的對(duì)象表示相同的行,或者它們共享相同的表和主鍵值,它們就是同一的。這個(gè)概念稱作數(shù)據(jù)庫(kù)同一性。74.2.2處理數(shù)據(jù)庫(kù)同一性給實(shí)體添加標(biāo)識(shí)符屬性 標(biāo)識(shí)符屬性很特殊——它的值是由持久化實(shí)例表示的數(shù)據(jù)庫(kù)行的主鍵值。 通常生命setId()方法為私有,并讓Hibernate生成和設(shè)置標(biāo)識(shí)符值。或者,用直接的字段訪問(wèn)映射,并僅實(shí)現(xiàn)一個(gè)獲取方法。(這個(gè)規(guī)則的例外是帶有自然鍵的類,在這些類中,標(biāo)識(shí)符的值在對(duì)象變成持久化之前由應(yīng)用分配,而不是由Hibernate生成。)主鍵值永遠(yuǎn)不變,否則該屬性將不是個(gè)適當(dāng)?shù)闹麈I備選對(duì)象!映射標(biāo)識(shí)符屬性<classname="Category"table="CATEGORY"><idname="id"column="CATEGORY_ID"type="long"><generatorclass="native"/></id>...</class>84.2.3數(shù)據(jù)庫(kù)主鍵選擇主鍵它的值(對(duì)于備選鍵的任意列而言)永遠(yuǎn)不為空。每一行都有唯一性的值。一個(gè)特定行的值永遠(yuǎn)不變。許多遺留的SQL數(shù)據(jù)模型使用自然主鍵。自然鍵是帶有業(yè)務(wù)意義的鍵:屬性或者屬性的組合因其業(yè)務(wù)語(yǔ)義而唯一。經(jīng)驗(yàn)表明,長(zhǎng)遠(yuǎn)來(lái)看自然鍵通常會(huì)產(chǎn)生問(wèn)題。好的主鍵必須是唯一的、不變和必要的(從不為空或者未知)。代理鍵沒有業(yè)務(wù)意義——它們是由數(shù)據(jù)庫(kù)或者應(yīng)用程序生成的唯一值。應(yīng)用程序的用戶最好不要看到或者引用這些鍵值。94.2.3數(shù)據(jù)庫(kù)主鍵Native:native同一性生成器挑選其他同一性生成器如identity、sequence或者h(yuǎn)illo,取決于底層數(shù)據(jù)庫(kù)的能力。使用這個(gè)生成器保證映射元數(shù)據(jù)可以移植到不同的數(shù)據(jù)庫(kù)管理系統(tǒng)Identity:這個(gè)生成器支持DB2、MySQL、MSSQLServer、Sybase和HypersonicSQL中同一性列。返貨的標(biāo)識(shí)符類型為long、short或者intSequence:這個(gè)生成器在DB2、PostgreSQL、Oracle、SAPDB或者M(jìn)ckoi中創(chuàng)建一個(gè)序列;或者使用InterBase中的一個(gè)生成器。返回的標(biāo)識(shí)符類型為long、short或者int。如果創(chuàng)建序列的其他設(shè)置要被添加到DDL,就使用sequence選項(xiàng)給序列定義一個(gè)目錄名稱Increment:Hibernate啟動(dòng)時(shí),這個(gè)生成器讀取表的最大(數(shù)字)主鍵列值,并且每次插入一個(gè)新行時(shí)值就增加1。生成的標(biāo)識(shí)符類型為long、short或者int。如果單服務(wù)器的Hibernate應(yīng)用程序?qū)?shù)據(jù)庫(kù)具有排它性訪問(wèn)時(shí),這個(gè)生成器特別有效,但不應(yīng)該被應(yīng)用于其他場(chǎng)合Hilo:高/低位算法是生成long類型標(biāo)識(shí)符的一種高效的方法,給定表和列(默認(rèn)時(shí),分別為hibernate_unique_key和next)作為高值的源。高/低位算法生成僅對(duì)特定數(shù)據(jù)庫(kù)唯一的標(biāo)識(shí)符。高值從全局的源中獲取。Seqhilo:這個(gè)生成器的作用就像一般的hilo生成器,除了它使用一個(gè)具名的數(shù)據(jù)庫(kù)序列來(lái)生成高值之外uuid.hex:這個(gè)生成器是一個(gè)128位的UUID(生成String類型的標(biāo)識(shí)符的一種算法,在網(wǎng)絡(luò)內(nèi)部唯一)。IP地址與一個(gè)唯一的時(shí)間戳結(jié)合使用。UUID被編碼成為長(zhǎng)度32的十六進(jìn)制數(shù)字104.3.1動(dòng)態(tài)的SQL生成默認(rèn)情況下,Hibernate在啟動(dòng)時(shí)給每個(gè)持久化類創(chuàng)建SQL語(yǔ)句。這些語(yǔ)句是用來(lái)讀取單個(gè)行、刪除一行等的簡(jiǎn)單創(chuàng)建、讀取、更新和刪除。Hibernate在啟動(dòng)時(shí)如何創(chuàng)建UPDATE語(yǔ)句?畢竟,這時(shí)候還不知道要更新的列。SQL語(yǔ)句更新所有的列,并且如果特定列的值沒有被修改,這個(gè)語(yǔ)句就會(huì)把它設(shè)置為它的舊值。在這些情況下,例如包含幾百列的一個(gè)遺留表,在該表中,即使最簡(jiǎn)單的操作(假設(shè)只有一個(gè)列需要更新)的SQL語(yǔ)句也將很大,必須關(guān)閉這個(gè)啟動(dòng)時(shí)的SQL生成,并切換到運(yùn)行時(shí)生成的動(dòng)態(tài)語(yǔ)句。<class>映射元素中有兩個(gè)屬性可以禁用啟動(dòng)時(shí)CRUDSQL的生成:<classname="Item"dynamic-insert="true"dynamic-update="true">...</class>114.3.2使實(shí)體不可變一個(gè)特定類的實(shí)例可以是不可變的。例如,在CaveatEmptor中,對(duì)貨品所做的Bid是不可變的。因此,在Bid表中永遠(yuǎn)不需要執(zhí)行UPDATE語(yǔ)句。通過(guò)mutable屬性設(shè)置為false來(lái)映射一個(gè)不可變的類,就可以避免臟檢查:<hibernate-mappingdefault-access="field"><classname="Bid"mutable="false">...</class></hibernate-mapping>124.3.3給查詢命名實(shí)體默認(rèn)情況下,所有類名都自動(dòng)地“導(dǎo)入”到Hibernate查詢語(yǔ)言(HQL)的命名空間。換句話說(shuō),可以在HQL中使用沒有包前綴的短類名。如果給定的SessionFactory存在兩個(gè)同名的類,這兩個(gè)類可能在領(lǐng)域模型的不同包中,這個(gè)自動(dòng)導(dǎo)入就可以關(guān)閉。如果存在沖突,設(shè)置autoimport=“false”134.3.4聲明包名稱CaveatEmptor應(yīng)用程序的所有持久化類都在Java包aution.model中聲明。然而,你并不想每當(dāng)在關(guān)聯(lián)、子類或者組件映射中命名這個(gè)類或者任何其他類時(shí)都重復(fù)整個(gè)包名稱。替換做法是,指定一個(gè)package屬性:<hibernate-mappingpackage="auction.model"><classname="Item"table="ITEM">...</class></hibernate-mapping>144.3.5用引號(hào)把SQL標(biāo)識(shí)符括起來(lái)默認(rèn)情況下,Hibernate沒有在生成的SQL中用引號(hào)把表和列名括起來(lái)。這使得SQL稍微更容易閱讀,也允許你利用這樣的事實(shí):大部分SQL數(shù)據(jù)庫(kù)在比較沒有用引號(hào)括起來(lái)的標(biāo)識(shí)符時(shí)都是不區(qū)分大小寫的。有時(shí)候,特別是在遺留數(shù)據(jù)庫(kù)中,你會(huì)遇到包含奇怪字符或者空格的標(biāo)識(shí)符,或者你希望強(qiáng)制區(qū)分大小寫。如果在映射文檔中用反引號(hào)(backtick)把表名或者列名括起來(lái),Hibernate就會(huì)始終在生成的SQL中把這個(gè)標(biāo)識(shí)符用引號(hào)括起來(lái)。154.4.1映射基礎(chǔ)屬性(1/4)一個(gè)典型的Hibernate屬性映射定義了一個(gè)POJO的屬性名稱、一個(gè)數(shù)據(jù)庫(kù)列名和一個(gè)Hibernate類型的名稱,并且它可能經(jīng)常省略類型。Hibernate的反射決定屬性的Java類型。因而,下列映射是等價(jià)的:<propertyname="description"column="DESCRIPTION"type="string"/><propertyname="description"column="DESCRIPTION"/><propertyname="description"column="DESCRIPTION"type="string"/><propertyname="description"type="string"><columnname="DESCRIPTION"/></property>164.4.1映射基礎(chǔ)屬性(2/4)類的屬性由持久化引擎直接(通過(guò)字段)或者間接(通過(guò)獲取方法和設(shè)置方法屬性訪問(wèn)方法)訪問(wèn)。在XML映射文件中,用hibernate-mappingrootelement的default-access=“field|property|noop|custom.Class”屬性給類控制默認(rèn)的訪問(wèn)策略。<propertyname="description"column="DESCR"access="field"/>除了字段和屬性訪問(wèn)之外,另一個(gè)可能有用的策略是noop。它映射Java持久化類中不存在的屬性。這聽起來(lái)有點(diǎn)奇怪,但是它讓你在HQL查詢中指向這個(gè)“虛擬”屬性(換句話說(shuō),只在HQL查詢中使用數(shù)據(jù)庫(kù)列)。如果沒有合適的內(nèi)建訪問(wèn)策略,也可以通過(guò)實(shí)現(xiàn)接口perty。PropertyAccesssor定義自己的定制屬性訪問(wèn)策略。174.4.1映射基礎(chǔ)屬性(3/4)衍生屬性的值在運(yùn)行時(shí)計(jì)算,通過(guò)對(duì)利用formula屬性定義的表達(dá)式求值。<propertyname="totalIncludingTax"formula="TOTAL+TAX_RATE*TOTAL"type="big_decimal"/>這個(gè)給定的SQL公式在每次從數(shù)據(jù)庫(kù)獲取實(shí)體時(shí)求值(并且在任何其他時(shí)間不求值,因此如果其他的屬性被修改,這個(gè)結(jié)果就可能過(guò)時(shí))。184.4.1映射基礎(chǔ)屬性(4/4)生成的和默認(rèn)的屬性值想象類的一個(gè)特定屬性有著數(shù)據(jù)庫(kù)生成的值,通常在第一次插入實(shí)體行的時(shí)候。典型的數(shù)據(jù)庫(kù)生成的值是創(chuàng)建的時(shí)間戳、對(duì)一件貨品的默認(rèn)價(jià)格,以及每次修改時(shí)運(yùn)行的觸發(fā)器。每當(dāng)Hibernate給定義了已生成屬性的實(shí)體執(zhí)行SQLINSERT或者UPDATE時(shí),它在獲取已生成的值之后立即執(zhí)行SELECT。使用映射中的generated開關(guān)啟用這個(gè)自動(dòng)刷新。<propertyname="lastModified"column="LAST_MODIFIED"update="false"insert="false"generated="always"/>標(biāo)記為數(shù)據(jù)庫(kù)生成的屬性還必須是非可插入和非可更新的,用insert和update屬性進(jìn)行控制它們。如果兩者都設(shè)置為false,屬性的列就永遠(yuǎn)不會(huì)出現(xiàn)在INSERT或者UPDATE語(yǔ)句中——屬性值是只讀的。而且,通常不在類中給不可變的屬性添加公有的設(shè)置方法。194.1.2定義概念我們提倡類比表多的設(shè)計(jì):一行表示多個(gè)實(shí)例。由于數(shù)據(jù)庫(kù)同一性由主鍵值實(shí)現(xiàn),有些持久化對(duì)象將沒有自己的同一性。Hibernate產(chǎn)生了下列本質(zhì)的特征:實(shí)體類型的對(duì)象有它自己的數(shù)據(jù)庫(kù)同一性(主鍵值)。值類型的對(duì)象沒有數(shù)據(jù)庫(kù)同一性:它屬于一個(gè)實(shí)體類型,并且它的持久化狀態(tài)被嵌入到自身實(shí)體的表行中。值類型沒有標(biāo)識(shí)符或者標(biāo)識(shí)符屬性。值類型實(shí)例的壽命受它自己的實(shí)體實(shí)例的壽命限制。值類型不支持共享引用。204.1理解實(shí)體和值類型實(shí)體是表述一級(jí)業(yè)務(wù)對(duì)象的持久化類型(術(shù)語(yǔ)“對(duì)象”在這里指它本來(lái)的含義)。換句話說(shuō),你在一個(gè)應(yīng)用程序中必須處理的有些類和類型更為重要,它一般使得其他的類和類型變得比較不重要。214.1.1細(xì)粒度的領(lǐng)域模型粗略的說(shuō),細(xì)粒度意味著類比表更多。例如,用戶可能既有付款地址又有家庭住址。在數(shù)據(jù)庫(kù)中,你可能有單個(gè)USERS表,包含列BILLING_STREET、BILLING_CITY和BILLING_ZIPCODE,以及HOME_STREET、HOME_CITY和HOME_ZIPCODE。在領(lǐng)域模型中,可以使用相同的方法,把兩個(gè)地址表示為User類的6個(gè)字符串值屬性。但是用Address類給它建立模型會(huì)更好,在這個(gè)模型中User有billingAddress和homeAddress屬性,從而給一個(gè)表使用三個(gè)類。224.4.2映射組件(1/4)目前為止,對(duì)象模型的類已經(jīng)全部成為實(shí)體類,每一個(gè)都有自己的生命周期和同一性。然而,User類與Address類有著一種特殊的關(guān)聯(lián)。234.4.2映射組件(2/4)把Address映射為值類型,把User映射為實(shí)體。這影響POJO類的實(shí)現(xiàn)嗎?publicclassAddress{privateStringstreet;privateStringzipcode;privateStringcity;publicAddress(){}publicStringgetStreet(){returnstreet;}publicvoidsetStreet(Stringstreet){this.street=street;}publicStringgetZipcode(){returnzipcode;}publicvoidsetZipcode(Stringzipc
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 版企業(yè)培訓(xùn)合作合同
- 運(yùn)動(dòng)自行車品牌代理合同
- 新疆沙雅縣市級(jí)名校2025屆初三下學(xué)期英語(yǔ)試題分類匯編含答案
- 五金制品鋸類購(gòu)銷協(xié)議
- 小型企業(yè)勞動(dòng)合同模板
- 土地使用權(quán)買賣合同模板范本
- 商場(chǎng)店鋪?zhàn)赓U合同范本
- 冀教版小學(xué)數(shù)學(xué)六年級(jí)下冊(cè)小升初畢業(yè)會(huì)考模擬卷(三) (含答案)
- 2025年云南省曲靖市沾益區(qū)民族中學(xué)中考?xì)v史一模試卷(含答案)
- 智能設(shè)備服務(wù)合同
- 住院醫(yī)師規(guī)范化培訓(xùn)教學(xué)查房課件
- 2022-2023學(xué)年天津市部分區(qū)八年級(jí)(下)期中物理試卷(含解析)
- 酒精計(jì)法測(cè)定酒精中酒精度
- 嬰幼兒語(yǔ)言發(fā)育篩查量表
- 川教版生命生態(tài)安全一年級(jí)上冊(cè)第12課 做一個(gè)受歡迎的人 教學(xué)設(shè)計(jì)
- 油氣輸送管道高后果區(qū)識(shí)別與評(píng)價(jià)釋義
- 高價(jià)值專利挖掘布局
- 托業(yè)考試TOEIC詞匯匯總
- DL-T 736-2021 農(nóng)村電網(wǎng)剩余電流動(dòng)作保護(hù)器安裝運(yùn)行規(guī)程
- SB/T 10439-2007醬腌菜
- FZ/T 62034-2016磁性軟紗門
評(píng)論
0/150
提交評(píng)論