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

下載本文檔

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

文檔簡(jiǎn)介

1、第二章 Hibernate對(duì)象關(guān)系映射上節(jié)回顧 Hibernate的映射文件詳細(xì)配置 掌握Hibernate應(yīng)用的七個(gè)步驟 熟練使用Hibernate實(shí)現(xiàn)如下操作 添加數(shù)據(jù) 修改數(shù)據(jù) 刪除數(shù)據(jù) 基本查詢操作主要內(nèi)容 對(duì)象關(guān)系映射 一對(duì)一單向關(guān)聯(lián) 一對(duì)一雙向關(guān)聯(lián) 多對(duì)一單向關(guān)聯(lián) 一對(duì)多單向關(guān)聯(lián) 多對(duì)一雙向關(guān)聯(lián)本講目標(biāo) 掌握Hibernate對(duì)象關(guān)系映射 多對(duì)一單向關(guān)聯(lián)(重點(diǎn)) 多對(duì)一雙向關(guān)聯(lián)(重點(diǎn)) 一對(duì)一單向關(guān)聯(lián) 一對(duì)一雙向關(guān)聯(lián)什么是關(guān)聯(lián)關(guān)系 什么是關(guān)聯(lián)關(guān)系 關(guān)聯(lián)關(guān)系表示不同類的對(duì)象之間的結(jié)構(gòu)關(guān)系,它在一段時(shí)間內(nèi)將多個(gè)類的實(shí)例連接在一起 進(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)操作能夠使程序員在編寫(xiě)程序過(guò)程中,減少對(duì)多表操作代碼的編寫(xiě),并且優(yōu)化了程序,提高了程序運(yùn)行的效率。 實(shí)體關(guān)聯(lián)關(guān)系 實(shí)體之間的關(guān)系 關(guān)聯(lián)關(guān)系 通過(guò)一個(gè)對(duì)象持有另一個(gè)對(duì)象的實(shí)例 泛化關(guān)系 通過(guò)對(duì)象之間的繼承方法來(lái)實(shí)現(xiàn) 類與類之間最普遍的關(guān)系就是關(guān)聯(lián)關(guān)系 在UML 語(yǔ)言中,關(guān)聯(lián)是有方向的關(guān)聯(lián)關(guān)系的類型 在Hibernate中關(guān)聯(lián)關(guān)系的類型 一對(duì)一關(guān)聯(lián) 假設(shè)有兩個(gè)實(shí)體,分別是客戶對(duì)象(Customer)和客戶身份對(duì)象(Certificate),它們之間就是一對(duì)一的關(guān)系。一個(gè)客戶只能有一個(gè)身份,一個(gè)身份也只能對(duì)應(yīng)一個(gè)客戶。該

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

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

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

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

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

8、系 以學(xué)生與班級(jí)為例 一個(gè)班級(jí)擁有多個(gè)學(xué)生 一個(gè)學(xué)生只屬于某個(gè)特定的班級(jí) 那么學(xué)生和班級(jí)之間為一對(duì)多的關(guān)系 那么在進(jìn)行關(guān)系映射時(shí),可以在多方進(jìn)行映射多對(duì)一單向關(guān)系映射 多對(duì)一的單向關(guān)系映射,需要在多端的映射文件中添加如下內(nèi)容: 其中name指定屬性名 其中column映射數(shù)據(jù)庫(kù)中所對(duì)應(yīng)的外鍵列多對(duì)一單向關(guān)系映射 在多對(duì)一單向關(guān)系映射中,一端無(wú)需進(jìn)行映射單向多對(duì)一關(guān)聯(lián) 在類與類之間各種各樣的關(guān)系中,多對(duì)一的單向關(guān)聯(lián)關(guān)系和關(guān)系數(shù)據(jù)庫(kù)中的外鍵參照關(guān)系最匹配 單向多對(duì)一關(guān)聯(lián)是最常見(jiàn)的單向關(guān)聯(lián)關(guān)系 在租房系統(tǒng)中從街道到區(qū)的關(guān)聯(lián)就是典型的多對(duì)一關(guān)聯(lián)租房系統(tǒng)中街道和區(qū)的實(shí)體類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 對(duì)應(yīng)的對(duì)應(yīng)的street 表是通過(guò)表是通過(guò)district_id 的值關(guān)聯(lián)至的值關(guān)聯(lián)至district 表的表的設(shè)置關(guān)系的字段設(shè)置關(guān)系的字段設(shè)置關(guān)系的對(duì)象設(shè)置關(guān)系的對(duì)象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)對(duì)象是否使用延遲加載以及延遲加載的策略Nproxyfetch設(shè)置抓取數(shù)據(jù)的策略Nselect配置映射文件并測(cè)試 hibernate.cfg.xml中指定映射文件 測(cè)試 District district = new District();Street street1 = new Street();Street street2 = new Street()

12、;Street street3 = new Street();district.setName(豐臺(tái)豐臺(tái)); /設(shè)置區(qū)的名稱設(shè)置區(qū)的名稱street1.setName(廣安路廣安路); /設(shè)置街道名稱設(shè)置街道名稱street1.setDistrict(district); /設(shè)置街道所在區(qū)設(shè)置街道所在區(qū)street2.setName(大紅門(mén)路大紅門(mén)路);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ū)一對(duì)多單向關(guān)聯(lián) 以上為在多端進(jìn)行關(guān)聯(lián)的關(guān)系映射方式,下面說(shuō)明在一端進(jìn)行單向關(guān)聯(lián)的映射方法一對(duì)多單向關(guān)聯(lián) 一對(duì)多單向關(guān)聯(lián)關(guān)系中,需要在一端的映射文件中加入如下內(nèi)容:一對(duì)多單向關(guān)系 元素包括以下屬性: name:設(shè)定待映射的持久化類的屬性名,這里為Clazz類的students屬性; lazy: 是否采用延遲加載。 inverse: 用于標(biāo)識(shí)雙向關(guān)

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

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

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

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

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論