第二章 Hibernate關(guān)系映射_第1頁
第二章 Hibernate關(guān)系映射_第2頁
第二章 Hibernate關(guān)系映射_第3頁
第二章 Hibernate關(guān)系映射_第4頁
第二章 Hibernate關(guān)系映射_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第二章 Hibernate對象關(guān)系映射上節(jié)回顧 Hibernate的映射文件詳細(xì)配置 掌握Hibernate應(yīng)用的七個步驟 熟練使用Hibernate實現(xiàn)如下操作 添加數(shù)據(jù) 修改數(shù)據(jù) 刪除數(shù)據(jù) 基本查詢操作主要內(nèi)容 對象關(guān)系映射 一對一單向關(guān)聯(lián) 一對一雙向關(guān)聯(lián) 多對一單向關(guān)聯(lián) 一對多單向關(guān)聯(lián) 多對一雙向關(guān)聯(lián)本講目標(biāo) 掌握Hibernate對象關(guān)系映射 多對一單向關(guān)聯(lián)(重點) 多對一雙向關(guān)聯(lián)(重點) 一對一單向關(guān)聯(lián) 一對一雙向關(guān)聯(lián)什么是關(guān)聯(lián)關(guān)系 什么是關(guān)聯(lián)關(guān)系 關(guān)聯(lián)關(guān)系表示不同類的對象之間的結(jié)構(gòu)關(guān)系,它在一段時間內(nèi)將多個類的實例連接在一起 進(jìn)行關(guān)聯(lián)操作的好處 在Hibernate中關(guān)聯(lián)關(guān)系表現(xiàn)在

2、所映射的表與表之間的關(guān)系,采用關(guān)聯(lián)操作,能夠使有關(guān)系的表之間保持?jǐn)?shù)據(jù)的同步 關(guān)聯(lián)操作能夠使程序員在編寫程序過程中,減少對多表操作代碼的編寫,并且優(yōu)化了程序,提高了程序運(yùn)行的效率。 實體關(guān)聯(lián)關(guān)系 實體之間的關(guān)系 關(guān)聯(lián)關(guān)系 通過一個對象持有另一個對象的實例 泛化關(guān)系 通過對象之間的繼承方法來實現(xiàn) 類與類之間最普遍的關(guān)系就是關(guān)聯(lián)關(guān)系 在UML 語言中,關(guān)聯(lián)是有方向的關(guān)聯(lián)關(guān)系的類型 在Hibernate中關(guān)聯(lián)關(guān)系的類型 一對一關(guān)聯(lián) 假設(shè)有兩個實體,分別是客戶對象(Customer)和客戶身份對象(Certificate),它們之間就是一對一的關(guān)系。一個客戶只能有一個身份,一個身份也只能對應(yīng)一個客戶。該

3、一對一關(guān)聯(lián)可以分為兩種,分別是以主鍵關(guān)聯(lián)和以外鍵關(guān)聯(lián)。 一對多關(guān)聯(lián)/多對一關(guān)聯(lián) 一對多和多對一關(guān)聯(lián)分為單向關(guān)聯(lián)和雙向關(guān)聯(lián),在此,著重介紹雙向關(guān)聯(lián)。假設(shè)有兩個實體,學(xué)生對象(Student)和班級對象(Clazz),一個班級可以有多個學(xué)生,表現(xiàn)為一對多的關(guān)系,一個學(xué)生只能屬于某個特定的班級,表現(xiàn)為多對一的關(guān)系 。關(guān)聯(lián)關(guān)系的類型 多對多關(guān)聯(lián) Hibernate關(guān)聯(lián)關(guān)系中相對比較特殊的就是多對多關(guān)聯(lián),多對多關(guān)聯(lián)與一對一關(guān)聯(lián)和一對多關(guān)聯(lián)不同,多對多關(guān)聯(lián)需要另外一張映射表用于保存多對多映射信息。 由于多對多關(guān)聯(lián)的性能不佳(由于引入了中間表,一次讀取操作需要反復(fù)數(shù)次查詢),因此在設(shè)計中應(yīng)該避免大量使用。同

4、時,在對多對關(guān)系中,應(yīng)根據(jù)情況,采取延遲加載機(jī)制來避免無謂的性能開銷。關(guān)聯(lián)關(guān)系的類型 多對多關(guān)系 多對多關(guān)聯(lián)只有雙向關(guān)聯(lián),假如有訂單對象(Order)和產(chǎn)品對象(Product),一個訂單可以對應(yīng)多個產(chǎn)品,一個產(chǎn)品同樣也可以對應(yīng)多個訂單,訂單和產(chǎn)品的關(guān)系就屬于多對多關(guān)聯(lián)關(guān)系。 為表示它們之間的關(guān)系,還需建立一張訂單產(chǎn)品關(guān)系表(Order_Product),這張表里只存儲order表和product表的關(guān)聯(lián)關(guān)系,并沒有額外的內(nèi)容。一對一外鍵單向關(guān)系映射 以客戶和客戶賬戶信息為例 一個客戶擁有一個唯一的賬戶信息 一個賬戶信息只能屬于某個特定客戶 那客戶與客戶賬戶信息之間為一對一的關(guān)聯(lián)關(guān)系 以下描述

5、一對一單向關(guān)系映射 在一對一關(guān)系映射中,我們可以將關(guān)系映射在關(guān)系中任何一方,如將關(guān)系映射在Customer方一對一外鍵單向關(guān)系映射 那么在一對一單向關(guān)系中,在關(guān)系的主控方即Customer的映射文件中,需要對關(guān)系進(jìn)行映射: 一對一單向關(guān)系映射和多對一單向關(guān)系映射十分類似,需要在Custom.hbm.xml中作如下映射: 其中name指定屬性名 Column指定外鍵 Unique指定當(dāng)前關(guān)系為一對一一對一外鍵單向關(guān)系映射 在關(guān)系方,勿需做任何映射一對一外鍵雙向關(guān)系映射 在一對一的外鍵雙向關(guān)聯(lián)中,關(guān)系的雙方都需要進(jìn)行關(guān)聯(lián)一對一外鍵雙向關(guān)系映射 同樣在映射文件中也需要雙方進(jìn)行映射 外鍵所在方(主控方

6、),映射不變一對一外鍵雙向關(guān)系映射 另外一方,需要添加如下映射信息 一對一外鍵雙向關(guān)聯(lián) 以外鍵關(guān)聯(lián)的一對一,其實本質(zhì)上變成了一對多的雙向關(guān)聯(lián),編寫時直接按照一對多和多對一的要求編寫,最后在many-to-one這一邊加上一個uique=“true”,說明它是一對多的特例。 one-to-one 節(jié)點有以下屬性: cascade :操作級聯(lián)(cascade)關(guān)系 constrained: 約束表明主控表的主鍵上是否存在一個外鍵(foreign key)對其進(jìn)行約束。這個選項關(guān)系到save、delete等方法的級聯(lián)操作順序。默認(rèn)為關(guān)聯(lián)類的主鍵屬性名。 一對一外鍵雙向關(guān)聯(lián) 級聯(lián)(cascade)在H

7、ibernate映射關(guān)系中是個非常重要的概念。 可選值有 all:所有情況下均進(jìn)行級聯(lián)操作; none:所有情況下均不進(jìn)行級聯(lián)操作; save-update:在執(zhí)行save-update時進(jìn)行級聯(lián)操作。 delete:在執(zhí)行delete時進(jìn)行級聯(lián)操作。 它指的是當(dāng)主控方執(zhí)行操作時,關(guān)聯(lián)對象(被動方)是否同步執(zhí)行同一操作。 如對主控對象調(diào)用save-update或delete方法時,是否同時對關(guān)聯(lián)對象被動方)進(jìn)行save-update或delete。這里,當(dāng)客戶(Customer)被更新或者刪除時,其所關(guān)聯(lián)的訂單(Order)同時被修改或者刪除,因此,這里的級聯(lián)關(guān)系設(shè)置為all。多對一單向關(guān)聯(lián)關(guān)

8、系 以學(xué)生與班級為例 一個班級擁有多個學(xué)生 一個學(xué)生只屬于某個特定的班級 那么學(xué)生和班級之間為一對多的關(guān)系 那么在進(jìn)行關(guān)系映射時,可以在多方進(jìn)行映射多對一單向關(guān)系映射 多對一的單向關(guān)系映射,需要在多端的映射文件中添加如下內(nèi)容: 其中name指定屬性名 其中column映射數(shù)據(jù)庫中所對應(yīng)的外鍵列多對一單向關(guān)系映射 在多對一單向關(guān)系映射中,一端無需進(jìn)行映射單向多對一關(guān)聯(lián) 在類與類之間各種各樣的關(guān)系中,多對一的單向關(guān)聯(lián)關(guān)系和關(guān)系數(shù)據(jù)庫中的外鍵參照關(guān)系最匹配 單向多對一關(guān)聯(lián)是最常見的單向關(guān)聯(lián)關(guān)系 在租房系統(tǒng)中從街道到區(qū)的關(guān)聯(lián)就是典型的多對一關(guān)聯(lián)租房系統(tǒng)中街道和區(qū)的實體類public class Dis

9、trict implements java.io.Serializable private Long id; private String name; /* 默認(rèn)的構(gòu)造方法默認(rèn)的構(gòu)造方法 */ public District() /省略省略setter/getter方法方法區(qū)區(qū)public class Street implements java.io.Serializable private Long id; private District district; private String name; /* 默認(rèn)的構(gòu)造方法默認(rèn)的構(gòu)造方法 */ public Street() public

10、District getDistrict() return this.district; public void setDistrict(District district) this.district = district; / 省略部分省略部分setter/getter方法方法街道街道租房系統(tǒng)中街道和區(qū)的映射文件 District.hbm.xml Street.hbm.xml與與Street 對應(yīng)的對應(yīng)的street 表是通過表是通過district_id 的值關(guān)聯(lián)至的值關(guān)聯(lián)至district 表的表的設(shè)置關(guān)系的字段設(shè)置關(guān)系的字段設(shè)置關(guān)系的對象設(shè)置關(guān)系的對象many-to-onemany-

11、to-one元素常用屬性 many-to-one 元素的常用屬性屬性含義和作用必須默認(rèn)值name映射類屬性的名稱 Yclass關(guān)聯(lián)類的完全限定名Ncolumn關(guān)聯(lián)的字段Nnot-null設(shè)置關(guān)聯(lián)的字段的值是否可以為空Nfalselazy指定關(guān)聯(lián)對象是否使用延遲加載以及延遲加載的策略Nproxyfetch設(shè)置抓取數(shù)據(jù)的策略Nselect配置映射文件并測試 hibernate.cfg.xml中指定映射文件 測試 District district = new District();Street street1 = new Street();Street street2 = new Street()

12、;Street street3 = new Street();district.setName(豐臺豐臺); /設(shè)置區(qū)的名稱設(shè)置區(qū)的名稱street1.setName(廣安路廣安路); /設(shè)置街道名稱設(shè)置街道名稱street1.setDistrict(district); /設(shè)置街道所在區(qū)設(shè)置街道所在區(qū)street2.setName(大紅門路大紅門路);street2.setDistrict(district);street3.setName(南苑路南苑路);street3.setDistrict(district);設(shè)置街道和區(qū)設(shè)置街道和區(qū)SessionFactory sessionFact

13、ory = null;Session session = null;Transaction tx= null;try sessionFactory = new Configuration().configure().buildSessionFactory(); session = sessionFactory.openSession(); tx= session.beginTransaction(); session.save(district); session.save(street1); session.save(street2); session.save(street3); mit(

14、);catch (HibernateException e) tx.rollback(); e.printStackTrace(); finally session.close(); sessionFactory.close();添加街道和區(qū)添加街道和區(qū)一對多單向關(guān)聯(lián) 以上為在多端進(jìn)行關(guān)聯(lián)的關(guān)系映射方式,下面說明在一端進(jìn)行單向關(guān)聯(lián)的映射方法一對多單向關(guān)聯(lián) 一對多單向關(guān)聯(lián)關(guān)系中,需要在一端的映射文件中加入如下內(nèi)容:一對多單向關(guān)系 元素包括以下屬性: name:設(shè)定待映射的持久化類的屬性名,這里為Clazz類的students屬性; lazy: 是否采用延遲加載。 inverse: 用于標(biāo)識雙向關(guān)

15、聯(lián)中的被動方一端,inverse=false的一方(主控方)負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系,默認(rèn)值 為false。 cascade 操作級聯(lián)(cascade)關(guān)系,可選值為all : 所有情況下均進(jìn)行級聯(lián)操作;none:所有情況下均不進(jìn)行級聯(lián)操作;save-update:在執(zhí)行save-update時進(jìn)行級聯(lián)操作.setset元素的常用屬性 set元素的常用屬性屬性含義和作用必須默認(rèn)值name映射類屬性的名稱 Ytable關(guān)聯(lián)類的目標(biāo)數(shù)據(jù)庫表Nlazy指定關(guān)聯(lián)對象是否使用延遲加載以及延遲加載的策略Nproxyfetch設(shè)置抓取數(shù)據(jù)的策略Nselect一對多單向關(guān)聯(lián) 元素還包含兩個子元素: 元素設(shè)定與所關(guān)聯(lián)的

16、持久化類對應(yīng)的表的外鍵,此處為student表的cls_id 元素設(shè)定所關(guān)聯(lián)的持久化類,此處為Student類。 雙向一對多關(guān)聯(lián) 單向一對多 單向多對一 同時配置兩者就成了雙向一對多關(guān)聯(lián)一對多雙向關(guān)聯(lián) 一對多(多對一)雙向關(guān)聯(lián)是多對一單向關(guān)聯(lián)和一對多單向關(guān)聯(lián)的綜合,在關(guān)系的雙方都進(jìn)行關(guān)聯(lián)一對多雙向關(guān)聯(lián)多對一雙向關(guān)聯(lián)CRUD cascade屬性 節(jié)點、節(jié)點以及節(jié)點擁有此屬性 屬性值有: all:所有情況下均進(jìn)行級聯(lián)操作; none:所有情況下均不進(jìn)行級聯(lián)操作; save-update:在執(zhí)行save-update時進(jìn)行級聯(lián)操作。 delete:在執(zhí)行delete時進(jìn)行級聯(lián)操作。 作用: 它指的是

17、當(dāng)主控方執(zhí)行操作時,關(guān)聯(lián)對象(被動方)是否同步執(zhí)行同一操作。inverseinverse屬性 術(shù)語“inverse”直譯為“反轉(zhuǎn)” 在Hibernate 中,inverse屬性指定了關(guān)聯(lián)關(guān)系中的方向 關(guān)聯(lián)關(guān)系中,inverse=false 的為主動方,由主動方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系 在一對多關(guān)聯(lián)中,將one 方的inverse 設(shè)置為true,這將有助性能的改善inverse指的是關(guān)聯(lián)關(guān)系的控制方向,而指的是關(guān)聯(lián)關(guān)系的控制方向,而cascade指的是指的是層級之間的連鎖操作層級之間的連鎖操作 多對多關(guān)聯(lián)關(guān)系 Hibernate關(guān)聯(lián)關(guān)系中相對比較特殊的就是多對多關(guān)聯(lián),多對多關(guān)聯(lián)與一對一關(guān)聯(lián)和一對多關(guān)聯(lián)

18、不同,多對多關(guān)聯(lián)需要另外一張映射表用于保存多對多映射信息。 由于多對多關(guān)聯(lián)的性能不佳(由于引入了中間表,一次讀取操作需要反復(fù)數(shù)次查詢),因此在設(shè)計中應(yīng)該避免大量使用。同時,在對多對關(guān)系中,應(yīng)根據(jù)情況,采取延遲加載機(jī)制來避免無謂的性能開銷。多對多關(guān)聯(lián)關(guān)系 如:教師和學(xué)生之間的關(guān)系 一個教師可以教多個學(xué)生 一個學(xué)生可以被多個教師教 那么學(xué)生和教師之間為多對多關(guān)系 那么在這里需要一個中間表來映射學(xué)生和教師之間的關(guān)系,如teachers_students 下面看下多對一的單向關(guān)聯(lián) 在教師端進(jìn)行關(guān)聯(lián)多對多關(guān)聯(lián)關(guān)系 多對多單向關(guān)聯(lián)關(guān)系 需要在Teacher.hbm.xml做如下映射:多對多關(guān)聯(lián)關(guān)系 多對多單向關(guān)聯(lián) Student.hbm.xml中無需做特別的映射多對多雙向關(guān)聯(lián) 多對多雙向關(guān)聯(lián): 多對多雙向關(guān)聯(lián)需要在單向的基礎(chǔ)上做如下改動: 為Student對象添加關(guān)聯(lián)關(guān)系 為Student.hbm.xml做關(guān)聯(lián)映射many-to-manymany-to-many關(guān)聯(lián) 數(shù)

溫馨提示

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

評論

0/150

提交評論