第9章 Hibernate映射機(jī)制_第1頁(yè)
第9章 Hibernate映射機(jī)制_第2頁(yè)
第9章 Hibernate映射機(jī)制_第3頁(yè)
第9章 Hibernate映射機(jī)制_第4頁(yè)
第9章 Hibernate映射機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩67頁(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、9.1 主鍵映射主鍵映射9.2 數(shù)據(jù)類型映射數(shù)據(jù)類型映射9.3 對(duì)象關(guān)系映射對(duì)象關(guān)系映射9.4 動(dòng)態(tài)類的使用動(dòng)態(tài)類的使用1第一種區(qū)分方法第一種區(qū)分方法 單個(gè)主鍵:由表的單個(gè)字段組成。 復(fù)合主鍵:由表的多個(gè)字段共同組成。2第二種區(qū)分方法第二種區(qū)分方法 自然主鍵:具有業(yè)務(wù)意義的字段作為主鍵,例如,學(xué)生表中用XH(學(xué)號(hào))作為主鍵。 代理主鍵:定義的、專門用來(lái)標(biāo)識(shí)記錄的id,它除了用來(lái)標(biāo)識(shí)記錄外,不具有任何的業(yè)務(wù)實(shí)體意義。但不管是什么主鍵,它都必須滿足以下幾個(gè)條件: 主鍵不能為空。 主鍵不能重復(fù)。 主鍵不能被修改。代理主鍵是自定義的、用來(lái)標(biāo)識(shí)表記錄的,不具有任何的業(yè)務(wù)實(shí)體意義,一般表中加入一個(gè)id字段

2、來(lái)標(biāo)識(shí)。如【實(shí)例8.1】中POJO類表示為:public class UserTable implements java.io.Serializable / 屬性private Integer id;/ 對(duì)應(yīng)表中 id 字段/省略其他屬性/構(gòu)造方法/ 屬性id的get和set方法public Integer getId() return this.id;public void setId(Integer id) this.id = id;/ 省略其他屬性的get和set方法對(duì)應(yīng)的映射文件配置為:下面列舉這些生成方式,并簡(jiǎn)單介紹它們的應(yīng)用方法。 assigned:應(yīng)用程序自身對(duì)id賦值。 nat

3、ive:由數(shù)據(jù)庫(kù)對(duì)id賦值。 hilo:通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫(kù)表保存主鍵生成歷史狀態(tài)。 seqhilo:與hi/lo類似,通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,只是主鍵歷史狀態(tài)保存在sequence中,適用于支持sequence的數(shù)據(jù)庫(kù),如Oracle。 increment:主鍵按數(shù)值順序遞增。 identity:采用數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制,如SQL Server、MySQL中的自增主鍵生成機(jī)制。 sequence:采用數(shù)據(jù)庫(kù)提供的sequence機(jī)制生成主鍵,如Oracle sequence。 uuid.hex:由Hibernate基于128位唯一值產(chǎn)生算法

4、,根據(jù)當(dāng)前設(shè)備IP、時(shí)間、JVM啟動(dòng)時(shí)間、內(nèi)部自增量等4個(gè)參數(shù)生成十六進(jìn)制數(shù)值(編碼后長(zhǎng)度為32位的字符串表示)作為主鍵。 uuid.string:與uuid.hex類似,只是對(duì)生成的主鍵進(jìn)行編碼(長(zhǎng)度為16位)。在某些數(shù)據(jù)庫(kù)中可能出現(xiàn)問(wèn)題。 foreign:使用外部表的字段作為主鍵。該主鍵一般應(yīng)用在表與表之間的關(guān)系上,會(huì)在后面的表對(duì)應(yīng)關(guān)系上進(jìn)一步講解。 select:Hibernate 3引入的主鍵生成機(jī)制,主要針對(duì)遺留系統(tǒng)的改造工程。自然主鍵雖然不提倡使用,但使用自然主鍵的情況還是存在的,例如學(xué)生表,如果不單獨(dú)指定代理主鍵id的話,就要用到自然主鍵XH(學(xué)號(hào)),POJO類編寫為:publi

5、c class XS private String xh;public String getXh() return xh;public void setXh(String xh) this.xh = xh;/省略其他屬性及get和set方法對(duì)應(yīng)在映射文件中的主鍵配置為:1單獨(dú)定義主鍵類單獨(dú)定義主鍵類單獨(dú)定義主鍵類,即把主鍵的屬性組成一個(gè)新的類,這個(gè)類與要映射的POJO類類似,也要生成它的get和set方法,但是該類并不作為POJO類使用,而是作為映射POJO類的一個(gè)主鍵屬性。假設(shè)有一個(gè)成績(jī)表,該表的結(jié)構(gòu)如表9.1所示。字 段 名數(shù)據(jù)類型主 鍵自 增允許為空描 述XHvarchar(50)是學(xué)號(hào)

6、KCHvarchar(50)是課程號(hào)CJint是成績(jī)首先把主鍵封裝成一個(gè)類,該類有兩個(gè)要求。(1)實(shí)現(xiàn)java.lang.Serializable接口。(2)重寫equals()和 hashCode()方法,當(dāng)驗(yàn)證兩個(gè)Cj對(duì)象是否相等時(shí),Hibernate會(huì)使用這里的equals ()方法進(jìn)行判斷,即判斷兩個(gè)對(duì)象的xh和kch是否相等。然后在真正的映射POJO中使用:package org.vo;public class Cj implements java.io.Serializableprivate CjId id;private int cj;public CjId getId() re

7、turn id;public void setId(CjId id) this.id = id;public int getCj() return cj;public void setCj(int cj) this.cj = cj;POJO類編寫完成后,可以編寫配置文件Cj.hbm.xml,代碼如下:配置完成后,下面來(lái)看復(fù)合主鍵如何操作數(shù)據(jù)庫(kù)數(shù)據(jù)。 保存一個(gè)對(duì)象。public void saveCj()Transaction ts=session.beginTransaction();/定義事務(wù)CjId id=new CjId();/創(chuàng)建主鍵對(duì)象id.setXh(081101);/設(shè)置學(xué)號(hào)id

8、.setKch(001);/設(shè)置課程號(hào)Cj cj=new Cj();/創(chuàng)建POJO類對(duì)象cj.setId(id);/設(shè)置主鍵cj.setCj(80);/設(shè)置成績(jī)session.save(cj);/保存mit();/提交事務(wù) 修改一個(gè)對(duì)象。public void updateCj()Transaction ts=session.beginTransaction();CjId id=new CjId();/創(chuàng)建主鍵對(duì)象id.setXh(081101);/設(shè)置學(xué)號(hào)id.setKch(001);/設(shè)置課程號(hào)Cj cj=(Cj) session.load(Cj.class, id);/根據(jù)主鍵得到對(duì)象c

9、j.setCj(90);/重新賦值成績(jī)session.update(cj);/修改mit();/提交事務(wù)2不單獨(dú)定義主鍵類不單獨(dú)定義主鍵類不單獨(dú)定義主鍵類,就是把主鍵屬性直接放在POJO類中,不需要單獨(dú)對(duì)其進(jìn)行封裝,那么該P(yáng)OJO類就要實(shí)現(xiàn)java.io.Serializable接口,并重寫equals()和hashCode()方法。同樣,映射文件Cj.hbm.xml也略有不同:由于這種情況是把主鍵放入POJO類中,故數(shù)據(jù)的存取也不同。 保存一個(gè)對(duì)象。public void saveCj()Transaction ts=session.beginTransaction(); /定義事務(wù)Cj c

10、j=new Cj(); /創(chuàng)建POJO類對(duì)象cj.setXh(081101); /設(shè)置學(xué)號(hào)cj.setKch(001); /設(shè)置課程號(hào)cj.setCj(80); /設(shè)置成績(jī)session.save(cj); /保存mit(); /提交事務(wù) 修改一個(gè)對(duì)象。public void updateCj1()Transaction ts=session.beginTransaction();/根據(jù)學(xué)號(hào)及課程號(hào)查詢,注意這里是HQL語(yǔ)句,Cj是類名,xh和kch是類中屬性/關(guān)于HQL語(yǔ)言會(huì)在后面講解Query query=session.createQuery(from Cj where xh=08110

11、1 and kch=001);Cj cj=(Cj) query.list().get(0); /得到第1個(gè)值cj.setCj(92);/重新賦值成績(jī)session.update(cj);/修改mit();/提交事務(wù)在Hibernate的映射文件中,用標(biāo)簽來(lái)說(shuō)明POJO類的屬性與數(shù)據(jù)庫(kù)表中的哪一個(gè)字段對(duì)應(yīng),用type屬性說(shuō)明對(duì)應(yīng)屬性應(yīng)該使用什么數(shù)據(jù)類型。例如,【實(shí)例8.1】的UserTable. hbm.xml中有: 上面代碼中的加黑部分,用type屬性來(lái)指定數(shù)據(jù)類型,這個(gè)屬性是Java數(shù)據(jù)類型,在Hibernate框架的內(nèi)部還有一套“Hibernate數(shù)據(jù)類型”,Hibernate就是通過(guò)它將

12、Java類型自動(dòng)轉(zhuǎn)換為數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)的SQL類型,如圖9.1所示,從而完成高質(zhì)量的ORM映射。用戶也可在配置文件中直接寫入設(shè)置Hibernate自身的數(shù)據(jù)類型,代碼如下:表9.2列舉了各數(shù)據(jù)類型之間的對(duì)應(yīng)關(guān)系。9.3.1 繼承關(guān)系映射繼承關(guān)系映射在實(shí)際應(yīng)用中,存在這樣一種情況:有很多種學(xué)生,如研究生、本科生等,它們都有學(xué)生的基本屬性,但又有各自的特殊屬性,故適合使用繼承來(lái)實(shí)現(xiàn)這樣的對(duì)象模型。例如,學(xué)生POJO類Xs.java代碼為:public class Xs private int id;/id標(biāo)識(shí)private String xh;/學(xué)號(hào)private String xm;/姓名privat

13、e Date bir;/出生時(shí)間/省略上述屬性的get和set方法研究生POJO類Yjs.java代碼為:public class Yjs extends Xsprivate String researchResult;/科研成果/省略屬性get和set方法本科生POJO類Bks.java代碼為:public class Bks extends Xsprivate boolean ky;/是否考研 /省略屬性get和set方法可以看到,繼承簡(jiǎn)化了程序的應(yīng)用?,F(xiàn)在就要考慮在數(shù)據(jù)庫(kù)中建表的問(wèn)題了,這種情況可以有3種方法來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)。(1)每個(gè)子類一個(gè)數(shù)據(jù)表。(2)每個(gè)類一個(gè)數(shù)據(jù)表。(3)共享一個(gè)數(shù)

14、據(jù)表。1每個(gè)子類一個(gè)數(shù)據(jù)表每個(gè)子類一個(gè)數(shù)據(jù)表這種設(shè)計(jì)非常簡(jiǎn)單,并沒(méi)有對(duì)這些繼承關(guān)系的特性做任何處理,兩張表對(duì)應(yīng)了兩個(gè)POJO類及各自的配置文件,它們之間并沒(méi)有任何的關(guān)系。 設(shè)計(jì)兩張數(shù)據(jù)庫(kù)表,分別是yjs表(如表9.3所示)和bks表(如表9.4所示)。字 段 名數(shù)據(jù)類型主 鍵自 增允許為空描 述idint是增1id標(biāo)識(shí)xhvarchar(50)學(xué)號(hào)xmvarchar(50)是姓名birdatetime是出生時(shí)間researchResultvarchar(50)是研究成果字 段 名數(shù)據(jù)類型主 鍵自 增允許為空描 述idint是增1id標(biāo)識(shí)xhvarchar(50)學(xué)號(hào)xmvarchar(50)姓

15、名birdatetime出生時(shí)間kybit是否考研表9.3 yjs表表9.4 bks表 建立兩張表對(duì)應(yīng)的POJO類。Yjs.java代碼為:package org.vo;import java.util.Date;public class Yjsprivate int id;/id標(biāo)識(shí)private String xh;/學(xué)號(hào)private String xm;/姓名private Date bir;/出生時(shí)間private String researchResult;/科研成果/省略上述屬性的get和set方法Bks.java代碼為:package org.vo;import java.ut

16、il.Date;public class Bksprivate int id;/id標(biāo)識(shí)private String xh;/學(xué)號(hào)private String xm;/姓名private Date bir;/出生時(shí)間private boolean ky;/是否考研/省略上述屬性的get和set方法 建立POJO類對(duì)應(yīng)的映射文件。Yjs.hbm.xml配置文件為:Bks.hbm.xml與Yjs.hbm.xml類似,只需要修改class的屬性name和table的值,即把修改為:然后把研究生的特有屬性修改為本科生特有的屬性,即把改為:2每個(gè)類一個(gè)數(shù)據(jù)表每個(gè)類一個(gè)數(shù)據(jù)表【實(shí)例9.1】采用“每個(gè)類一個(gè)

17、數(shù)據(jù)表”的方式,實(shí)現(xiàn)繼承關(guān)系映射。 創(chuàng)建Java項(xiàng)目,命名為“Inheritance_mapping”。 添加Hibernate框架,步驟同【實(shí)例8.1】第3步。HibernateSessionFactory類同樣位于org.util包下。 在TEST數(shù)據(jù)庫(kù)中創(chuàng)建表,設(shè)計(jì)xs表(如表9.5所示)、yjs表(如表9.6所示)、bks表(如表9.7所示)以及它們的關(guān)聯(lián)關(guān)系。 在項(xiàng)目src下創(chuàng)建org.vo包,在其中建立POJO類。Xs.java代碼為:public class Xs private Integer id;private String xh;private String xm;pri

18、vate Date bir;/省略上面屬性的get和set方法Yjs.java代碼為:public class Yjs extends Xsprivate Integer xsId;private String researchResult;/省略上面屬性的get和set方法Bks.java代碼為:public class Bks extends Xsprivate Integer xsId;private Boolean ky;/省略上面屬性的get和set方法 配置Xs.hbm.xml。這種情況下只需要配置一個(gè)Xs.hbm.xml即可,在該配置文件中要把Yjs與Bks的信息配置出來(lái)。 對(duì)數(shù)

19、據(jù)的存取。/插入一條研究生記錄public void saveYjs()Yjs yjs = new Yjs();yjs.setXh(081101);yjs.setXm(程明);yjs.setBir(new Date();yjs.setResearchResult(5項(xiàng)成果);Transaction ts = session.beginTransaction();session.save(yjs);mit();執(zhí)行程序后,會(huì)把xh、xm、bir記錄插入xs表中,把本條記錄的id值及researchResult記錄插入到y(tǒng)js表中。/插入一條本科生記錄public void saveBks()Bk

20、s bks = new Bks();bks.setXh(081102);bks.setXm(李方方);bks.setBir(new Date();bks.setKy(true);Transaction ts = session.beginTransaction();session.save(bks);mit();執(zhí)行程序后,會(huì)把xh、xm、bir記錄插入xs表中,把本條記錄的id值及ky記錄插入到bks表中。/查詢記錄public void query()List list = session.createQuery(from Yjs).list();for(int i=0;i);System

21、.out.println(yjs.getResearchResult();List list2 = session.createQuery(from Bks).list();for(int i=0;i);System.out.println(bks.getKy(); 編寫測(cè)試類。在項(xiàng)目src下創(chuàng)建org.test包,其下建立測(cè)試類InheritanceTest.java,代碼如下:public class InheritanceTest public Session session;public static void main(String args) InheritanceTest ht

22、= new InheritanceTest();/創(chuàng)建類對(duì)象ht.getCurrentSession();/獲得session對(duì)象ht.saveYjs();/插入一條研究生記錄ht.saveBks();/插入一條本科生記錄ht.query();/查詢記錄ht.closeSession(); /關(guān)閉sessionpublic void getCurrentSession() /獲得session方法public void closeSession() /關(guān)閉session方法public void saveYjs() /插入一條研究生記錄public void saveBks() /插入一條本科

23、生記錄public void query() /查詢記錄運(yùn)行程序,測(cè)試結(jié)果如圖9.2所示。3共享一個(gè)數(shù)據(jù)庫(kù)表共享一個(gè)數(shù)據(jù)庫(kù)表【實(shí)例實(shí)例9.2】采用“共享一個(gè)數(shù)據(jù)庫(kù)表”的方式,實(shí)現(xiàn)繼承關(guān)系映射。 采用這種方法,數(shù)據(jù)庫(kù)中只要建立一張表即可,如表9.8所示。字 段 名數(shù)據(jù)類型主 鍵自 增允許為空描 述idint是增1id標(biāo)識(shí)xhvarchar(50)學(xué)號(hào)xmvarchar(50)是姓名birdatetime是出生時(shí)間xsTypevarchar(50)是類型researchResultvarchar(50)是研究成果kybit是是否考研 POJO類的分配為,Xs.java中配置除子類各自獨(dú)特屬性外的所

24、有屬性,子類只配置各自的獨(dú)特屬性。在項(xiàng)目src下建org.vo.one包,用于存放新編寫的POJO類。Xs.java代碼編寫如下:public class Xs private int id;private String xh;private String xm;private Date bir;private String xsType;/省略上面屬性的get和set方法Yjs.java代碼編寫如下:public class Yjs extends Xsprivate String researchResult;/省略get和set方法Bks.java代碼編寫如下:public class

25、Bks extends Xsprivate Boolean ky;/省略get和set方法該種情況也只需要配置一個(gè)映射文件Xs.hbm.xml即可,其子類信息及關(guān)系也會(huì)在映射文件中體現(xiàn)。 數(shù)據(jù)的存取也很簡(jiǎn)單,只需操作不同的類來(lái)得到想要得到的信息。/插入一條記錄,并且該條記錄為研究生public void saveYjs()Transaction t = session.beginTransaction();Yjs yjs = new Yjs();yjs.setXh(081103);yjs.setXm(jack);yjs.setBir(new Date();yjs.setResearchResu

26、lt(3項(xiàng)成果);session.save(yjs);mit();運(yùn)行該段代碼后,程序會(huì)根據(jù)Yjs類設(shè)置Xs表中的xsType值為“yjs”,并把值插入到Xs表中。/插入一條記錄,并且該條記錄為本科生public void saveBks()Transaction t = session.beginTransaction();Bks bks = new Bks();bks.setXh(081104);bks.setXm(jacy);bks.setBir(new Date();bks.setKy(true);session.save(bks);mit();運(yùn)行該段代碼后,程序會(huì)根據(jù)Bks類設(shè)置X

27、s表中的xsType值為“bks”,并把值插入到Xs表中。/查詢記錄public void query()List list = session.createQuery(from Xs where xsType=yjs).list();for(int i=0;i);System.out.println(yjs.getResearchResult();List list1 = session.createQuery(from Yjs).list();for(int i=0;i);System.out.println(yjs.getResearchResult();List list2 = ses

28、sion.createQuery(from Bks).list();for(int i=0;i);System.out.println(bks.getKy();運(yùn)行程序,測(cè)試結(jié)果如圖9.3所示。1一對(duì)一關(guān)聯(lián)一對(duì)一關(guān)聯(lián) 共享主鍵方式。在注冊(cè)某個(gè)論壇會(huì)員的時(shí)候,往往不但要填寫登錄賬號(hào)和密碼,還要填寫其他的詳細(xì)信息,這兩部分信息通常會(huì)放在不同的表中,如表9.9和表9.10所示。字段名稱數(shù)據(jù)類型主 鍵自 增允許為空描 述IDint是id號(hào)USERNAMEvarchar(20)登錄賬號(hào)PASSWORDvarchar(20)登錄密碼字段名稱數(shù)據(jù)類型主 鍵自 增允許為空描 述IDint是增1id號(hào)TRUEN

29、AMEvarchar(8)是真實(shí)姓名EMAILvarchar(50)是電子郵件表9.9 登錄表login表9.10 詳細(xì)信息表detail【實(shí)例9.3】共享主鍵方式示例。(1)創(chuàng)建Java項(xiàng)目,命名為“Hibernate_mapping”。(2)添加Hibernate框架,步驟同前。HibernateSessionFactory類同樣位于org.util包下。(3)生成數(shù)據(jù)庫(kù)表對(duì)應(yīng)的Java類對(duì)象和映射文件。經(jīng)過(guò)上面的操作,雖然MyEclipse自動(dòng)生成了Login.java、Detail.java、Login.hbm.xml和Detail.hbm.xml共4個(gè)文件,但兩表之間并未自動(dòng)建立一對(duì)

30、一關(guān)聯(lián),仍需要用戶修改代碼和配置,手動(dòng)建立表之間的關(guān)聯(lián)。具體的修改內(nèi)容如下,在源代碼中以加黑標(biāo)識(shí)。修改login表對(duì)應(yīng)的POJO類Login.java,代碼為。修改detail表對(duì)應(yīng)的Detail.java,代碼為:public class Detail implements java.io.Serializable private Integer id;/ id號(hào)private String truename;/ 真實(shí)姓名private String email;/ 電子郵件private Login login;/ 添加屬性字段(登錄信息)public Detail(String true

31、name, String email, Login login) this.truename = truename;this.email = email;this.login = login;/ 完善構(gòu)造函數(shù)/ 增加 login 屬性的 get 和 set 方法public Login getLogin()return this.login;public void setLogin(Login login)this.login = login;修改login表與Login類的ORM映射文件Login.hbm.xml為: detail 修改detail表與Detail類的ORM映射文件Detai

32、l.hbm.xml為: (4)創(chuàng)建測(cè)試類。在src下創(chuàng)建包test,在該包下建立測(cè)試類,命名為Test.java。其代碼為。(5)運(yùn)行程序,測(cè)試結(jié)果。因?yàn)樵摮绦驗(yàn)镴ava Application,所以可以直接運(yùn)行。在完全沒(méi)有操作數(shù)據(jù)庫(kù)的情況下,程序就完成了對(duì)數(shù)據(jù)的插入。插入數(shù)據(jù)后,login表和detail表的內(nèi)容如圖9.4和圖9.5所示。 唯一外鍵方式。對(duì)應(yīng)的Person表和Room表如表9.11和表9.12所示。字段名稱數(shù)據(jù)類型主 鍵自 增允許為空描 述idint是增1id號(hào)namevarchar(20)姓名room_idint是房間號(hào)字段名稱數(shù)據(jù)類型主 鍵自 增允許為空描 述idint是

33、增1id號(hào)addressvarchar(100)地址表9.11 Person表表9.12 Room表【實(shí)例9.4】唯一外鍵方式示例。(1)在項(xiàng)目Hibernate_mapping的org.model包下生成表對(duì)應(yīng)的POJO類對(duì)象和映射文件,然后按照如下的方法修改。修改Person表對(duì)應(yīng)的POJO類Person.java,代碼為。修改Room表對(duì)應(yīng)的POJO類Room.java,代碼為:public class Room implements java.io.Serializable private Integer id;/ id號(hào)private String address;/ 地址priva

34、te Person person;/ 增加 person 屬性public Room(String address, Person person) this.address = address;this.person = person;/ 修改構(gòu)造函數(shù)/ 增加 person 屬性的 get 和 set 方法public Person getPerson()return this.person;public void setPerson(Person person)this.person = person;修改Person表與Person類的ORM映射文件Person.hbm.xml為: / 唯

35、一性約束,實(shí)現(xiàn)一對(duì)一 修改Room表與Room類的ORM映射文件Room.hbm.xml為: / 指定關(guān)聯(lián)類的屬性名 (2)編寫測(cè)試代碼。在src下的包test的Test類中加入如下代碼:Person person=new Person();person.setName(liumin);Room room=new Room();room.setAddress(NJ-S1-328);person.setRoom(room);session.save(person);(3)運(yùn)行程序,測(cè)試結(jié)果。因?yàn)樵摮绦驗(yàn)镴ava Application,所以可以直接運(yùn)行(運(yùn)行時(shí)把前面的測(cè)試代碼注釋掉)。在完全沒(méi)有

36、操作數(shù)據(jù)庫(kù)的情況下,程序就完成了對(duì)數(shù)據(jù)的插入。插入數(shù)據(jù)后,Person表和Room表的內(nèi)容如圖9.6和圖9.7所示。 2多對(duì)一單向關(guān)聯(lián)多對(duì)一單向關(guān)聯(lián)【實(shí)例9.5】多對(duì)一單向關(guān)聯(lián)示例。(1)在【實(shí)例9.4】基礎(chǔ)上修改,其對(duì)應(yīng)表不變,表對(duì)應(yīng)的Person類也不變,對(duì)應(yīng)的Person. hbm.xml文件修改如下: / 主控類所有操作,對(duì)關(guān)聯(lián)類也執(zhí)行同樣操作 而Room表不變,對(duì)應(yīng)的POJO類修改如下:public class Room implements java.io.Serializable private Integer id;/ id號(hào)private String address;/ 地

37、址/private Person person;/ 刪除 person 屬性/* full constructor */public Room(String address) this.address = address;/this.person = person;/ 修改構(gòu)造函數(shù)/ 省略上述各屬性的get和set方法最后,在映射文件Room.hbm.xml中刪去下面這一行:(2)編寫測(cè)試代碼。在src下包test的Test類中加入如下代碼:Room room=new Room();room.setAddress(NJ-S1-328);Person person=new Person();pe

38、rson.setName(liuyanmin);person.setRoom(room);session.save(person);(3)運(yùn)行程序,測(cè)試結(jié)果。直接運(yùn)行Java Application程序,在完全沒(méi)有操作數(shù)據(jù)庫(kù)的情況下,程序就完成了對(duì)數(shù)據(jù)的插入。插入數(shù)據(jù)后,Person表和Room表的內(nèi)容如圖9.8和圖9.9所示。 3一對(duì)多雙向關(guān)聯(lián)一對(duì)多雙向關(guān)聯(lián)【實(shí)例9.6】一對(duì)多雙向關(guān)聯(lián)示例。(1)在【實(shí)例9.5】基礎(chǔ)上修改,Person表對(duì)應(yīng)的POJO及其映射文件不用改變,現(xiàn)在來(lái)修改Room表對(duì)應(yīng)的POJO類及其映射文件。對(duì)應(yīng)的POJO類Room.java如下:package org.mod

39、el;import java.util.*;/ 導(dǎo)入用于集合操作的 Jar 包public class Room implements java.io.Serializable private Integer id;/ id號(hào)private String address;/ 地址private Set person = new HashSet();/ 定義集合,存放多個(gè) Person 對(duì)象/ 增加 Person 集合的get和set方法public Set getPerson()return person;public void setPerson(Set person)this.person

40、 = person;Room表與Room類的ORM映射文件Room.hbm.xml修改如下: /級(jí)聯(lián)程度 /充當(dāng)外鍵的字段名 /被關(guān)聯(lián)的類名字 (2)編寫測(cè)試代碼。在src下的包test的Test類中加入如下代碼:Person person1=new Person(); Person person2=new Person();Room room=new Room();room.setAddress(NJ-S1-328);person1.setName(李方方);person2.setName(王艷);person1.setRoom(room);person2.setRoom(room);/這樣

41、完成后就可以通過(guò)Session對(duì)象調(diào)用session.save(person1)和session.save(person2),會(huì)自動(dòng)保存roomsession.save(person1);session.save(person2);(3)運(yùn)行程序,測(cè)試結(jié)果。因?yàn)樵摮绦驗(yàn)镴ava Application,所以可以直接運(yùn)行。在完全沒(méi)有操作數(shù)據(jù)庫(kù)的情況下,程序就完成了對(duì)數(shù)據(jù)的插入。插入數(shù)據(jù)后,Person表和Room表的內(nèi)容如圖9.10和圖9.11所示。 由于是雙向的,當(dāng)然也可以從Room的一方來(lái)保存Person,在Test.java中加入如下代碼:.Person person1=new Perso

42、n(); Person person2=new Person();Room room=new Room();person1.setName(李方方);person2.setName(王艷);Set persons=new HashSet();persons.add(person1);persons.add(person2);room.setAddress(NJ-S1-328);room.setPerson(persons);/這樣完成后,就可以通過(guò)Session對(duì)象調(diào)用session.save(room),會(huì)自動(dòng)保存person1和person2.運(yùn)行程序,插入數(shù)據(jù)后,Person表和Room

43、表的內(nèi)容如圖9.12和圖9.13所示。 4多對(duì)多關(guān)聯(lián)多對(duì)多關(guān)聯(lián) 多對(duì)多單向關(guān)聯(lián)。學(xué)生和課程就是多對(duì)多的關(guān)系,一個(gè)學(xué)生可以選擇多門課程,而一門課程又可以被多個(gè)學(xué)生選擇。多對(duì)多關(guān)系在關(guān)系數(shù)據(jù)庫(kù)中不能直接實(shí)現(xiàn),還必須依賴一張連接表,如表9.13、表9.14和表9.15所示?!緦?shí)例9.7】單向多對(duì)多示例。(1)在項(xiàng)目Hibernate_mapping的org.model包下生成以上數(shù)據(jù)庫(kù)表對(duì)應(yīng)的POJO類對(duì)象和映射文件,然后進(jìn)行修改。student表對(duì)應(yīng)的POJO類修改如下:package org.model;import java.util.*;public class Student implem

44、ents java.io.Serializable private Integer id;/ ID號(hào)private String snumber;/ 學(xué)號(hào)private String sname;/ 姓名private Integer sage;/ 年齡private Set courses = new HashSet();/ 定義集合,存放多個(gè) Course 對(duì)象/ 增加 Course 集合的get和set方法public Set getCourses()return courses;public void setCourses(Set courses)this.courses = cour

45、ses;student表與Student類的ORM映射文件Student.hbm.xml修改如下: / 級(jí)聯(lián)程度 / 指定參照student表的外鍵名稱 / 指定參照course表的外鍵名稱 (2)編寫測(cè)試代碼。在src下的包test的Test類中加入如下代碼:Course cour1=new Course();Course cour2=new Course();Course cour3=new Course();cour1.setCnumber(101);cour1.setCname(計(jì)算機(jī)基礎(chǔ));cour2.setCnumber(102);cour2.setCname(數(shù)據(jù)庫(kù)原理);cou

46、r3.setCnumber(103);cour3.setCname(計(jì)算機(jī)原理);Set courses=new HashSet();courses.add(cour1);courses.add(cour2);courses.add(cour3);Student stu=new Student();stu.setSnumber(081101);stu.setSname(李方方);stu.setSage(21);stu.setCourses(courses);session.save(stu);/設(shè)置完成后就可以通過(guò)Session對(duì)象調(diào)用session.save(stu)完成持久化(3)運(yùn)行程序

47、,測(cè)試結(jié)果。因?yàn)樵摮绦驗(yàn)镴ava Application,所以可以直接運(yùn)行。在完全沒(méi)有操作數(shù)據(jù)庫(kù)的情況下,程序就完成了對(duì)數(shù)據(jù)的插入。插入數(shù)據(jù)后,student表、course表及連接表stu_cour的內(nèi)容如圖9.14、圖9.15和圖9.16所示。 多對(duì)多雙向關(guān)聯(lián)?!緦?shí)例9.8】雙向多對(duì)多示例。在【實(shí)例9.7】的基礎(chǔ)上修改,首先將其course表所對(duì)應(yīng)的POJO對(duì)象修改成如下代碼:package org.model;import java.util.HashSet;import java.util.Set;public class Course implements java.io.Serializable private int id;/ ID號(hào) private String cnumber;/ 課程號(hào) private String cname;/ 課程名 private Set stus=new HashSet();/ 定義集合,存放多個(gè) Student 對(duì)象 /省略上述各屬性的get和set方法course表與Course類的ORM映射文件Course.hbm.xml改為: / 級(jí)聯(lián)操作為所有 / 指定參照course表的外鍵名稱 / 指定參照student表的外鍵名稱 1配置映射文件配置映射文件例如,在講解Hibern

溫馨提示

  • 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)論