JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第1頁(yè)
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第2頁(yè)
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第3頁(yè)
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第4頁(yè)
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第5頁(yè)
已閱讀5頁(yè),還剩79頁(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)介

數(shù)據(jù)持久化——Hibernate1.Hibernate概述2.Hibernate應(yīng)用基礎(chǔ)3.Hibernate關(guān)系映射 1Hibernate概述1.ORM簡(jiǎn)介什么是ORM?將對(duì)象與對(duì)象之間的關(guān)系對(duì)應(yīng)到數(shù)據(jù)庫(kù)表與表之間的關(guān)系的一種模式。通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將Java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。1Hibernate概述一般的ORM包括四個(gè)部分:對(duì)持久類(lèi)對(duì)象進(jìn)行CRUD操作的API用來(lái)規(guī)定類(lèi)和類(lèi)屬性相關(guān)查詢的語(yǔ)言或API規(guī)定mappingmetadata的工具以及可以讓ORM實(shí)現(xiàn)同事務(wù)對(duì)象一起進(jìn)行dirtychecking、lazyassociationfetching和其他優(yōu)化操作的技術(shù)。4.1Hibernate概述2.Hibernate體系結(jié)構(gòu)可作為模型層/數(shù)據(jù)訪問(wèn)層。通過(guò)配置文件(hibernate.cfg.xml或perties)和映射文件(*.hbm.xml)把Java對(duì)象或持久化對(duì)象(PersistentObject,PO)映射到數(shù)據(jù)庫(kù)中的數(shù)據(jù)表,然后通過(guò)操作PO,對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行各種操作。PO就是POJO(普通Java對(duì)象)加映射文件。4.1Hibernate概述圖1Hibernate體系結(jié)構(gòu)2Hibernate應(yīng)用基礎(chǔ)2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)1.建立數(shù)據(jù)庫(kù)及表本例使用SQLServer2005數(shù)據(jù)庫(kù)。在XSCJ數(shù)據(jù)庫(kù)中建立KCB表:2Hibernate應(yīng)用基礎(chǔ)2.在MyEclipse中創(chuàng)建對(duì)SQLServer的連接【W(wǎng)indow】→【OpenPerspective】→【MyEclipseDatabaseExplorer】,打開(kāi)MyEclipseDatabase瀏覽器,右擊菜單,如圖2所示,選擇【New…】菜單項(xiàng),出現(xiàn)如圖3所示的對(duì)話框,編輯數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)。圖2MyEclipseDatabase瀏覽器,創(chuàng)建一個(gè)新的連接圖3編輯數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)

2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖4打開(kāi)數(shù)據(jù)庫(kù)連接編輯完成以后,在MyEclipseDatabase瀏覽器中,右擊剛才創(chuàng)建的MyConn數(shù)據(jù)庫(kù)連接,選擇“Openconnection…”菜單項(xiàng),打開(kāi)名為“MyConn”的數(shù)據(jù)連接,如圖4所示。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖5選擇Hibernate版本及所需Jar包3.創(chuàng)建Web項(xiàng)目,命名為“HibernateTest”4.添加Hibernate開(kāi)發(fā)能力右擊項(xiàng)目名HibernateTest,選擇【MyEclipse】→【AddHibernateCapabilites】菜單項(xiàng),出現(xiàn)如圖5所示的對(duì)話框,選擇Hibernate框架應(yīng)用版本及所需要的類(lèi)庫(kù)。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖6創(chuàng)建配置文件hibernate.cfg.xml單擊【Next】按鈕,進(jìn)入如圖6所示界面。創(chuàng)建Hibernate配置文件hibernate.cfg.xml,將該文件放在src文件夾下。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖7指定hibernate數(shù)據(jù)庫(kù)連接單擊【Next】按鈕,進(jìn)入如圖7所示界面,指定Hibernate數(shù)據(jù)庫(kù)連接細(xì)節(jié)。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖8創(chuàng)建SessionFactory類(lèi)來(lái)簡(jiǎn)化Hibernate會(huì)話處理單擊【Next】按鈕,出現(xiàn)如圖8所示界面。Hibernate中有一個(gè)與數(shù)據(jù)庫(kù)打交道重要的類(lèi)Session。而這個(gè)類(lèi)是由工廠SessionFactory創(chuàng)建的。這個(gè)界面詢問(wèn)是否需要?jiǎng)?chuàng)建SessionFactory類(lèi)。如果需要?jiǎng)?chuàng)建,還需要指定創(chuàng)建的位置和類(lèi)名。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)5.生成數(shù)據(jù)庫(kù)表對(duì)應(yīng)的Java類(lèi)對(duì)象和映射文件在MyEclispse下創(chuàng)建“org.model”的包,這個(gè)包將用來(lái)存放與數(shù)據(jù)庫(kù)表對(duì)應(yīng)的Java類(lèi)POJO。選擇【W(wǎng)indows】→【OpenPerspective】→【Other】→【MyEclipseDatabaseExplorer】菜單項(xiàng),打開(kāi)MyEclipseDatabaseExplorer視圖。打開(kāi)前面創(chuàng)建的MyConn數(shù)據(jù)連接,選擇【XSCJ】→【dbo】→【TABLE】菜單項(xiàng),右擊KCB表,選擇【HibernateReverseEngineering…】菜單項(xiàng),完成從已有的數(shù)據(jù)庫(kù)表生成對(duì)應(yīng)的Java類(lèi)和相關(guān)映像文件的配置工作。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖9Hibernate反向工程菜單2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖10生成Hibernate映射文件和Java類(lèi)首先,選擇生成的Java類(lèi)和映像文件所在的位置,如圖10所示。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)圖11配置反向工程細(xì)節(jié)使用POJO名稱是為了避免和EJB混淆起來(lái),其中有一些屬性及getter、setter方法。當(dāng)然,如果有一個(gè)簡(jiǎn)單的運(yùn)算屬性也是可以的,但不允許有業(yè)務(wù)方法。單擊【Next】按鈕,進(jìn)入如圖11所示的界面,選擇主鍵生成策略。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)最后單擊【Finish】按鈕完成項(xiàng)目中的org.model包中會(huì)出現(xiàn)Kcb.java類(lèi)和Kcb.hbm.xml.完成之后還要在hibernate.cfg.xml文件中配置映射文件<mappingresource=“org/model/Kcb.hbm.xml”/>該語(yǔ)句放在<sessionFactory>與</sessionFactory>之間2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)6.創(chuàng)建測(cè)試類(lèi):在src文件夾下創(chuàng)建包test,在該包下建立測(cè)試類(lèi),命名為T(mén)est.java,其代碼。2.1Hibernate應(yīng)用實(shí)例開(kāi)發(fā)7.運(yùn)行因?yàn)樵摮绦驗(yàn)镴avaApplication,所以可以直接運(yùn)行。運(yùn)行程序,控制臺(tái)就會(huì)打印出“機(jī)電”。在完全沒(méi)有操作數(shù)據(jù)庫(kù)的情況下,就完成了對(duì)數(shù)據(jù)的插入。2.2Hibernate各種文件的作用1.POJO類(lèi)和其映射配置文件Hibernate的映射配置文件是實(shí)體對(duì)象與數(shù)據(jù)庫(kù)關(guān)系表之間相互轉(zhuǎn)換的重要依據(jù);一般而言,一個(gè)映射配置文件對(duì)應(yīng)著數(shù)據(jù)庫(kù)中的一個(gè)關(guān)系表;關(guān)系表之間的關(guān)聯(lián)關(guān)系也在映射文件中配置。2.2Hibernate各種文件的作用POJO類(lèi)如下:packageorg.model;publicclassKcbimplementsjava.io.Serializable{ privateStringkch; //對(duì)應(yīng)表中KCH字段 privateStringkcm; //對(duì)應(yīng)表中KCM字段 privateShortkxxq; //對(duì)應(yīng)表中KXXQ字段 privateIntegerxs; //對(duì)應(yīng)表中XS字段 privateIntegerxf; //對(duì)應(yīng)表中XF字段 publicKcb(){ } //上述屬性的getter和setter方法}可以發(fā)現(xiàn),該類(lèi)中的屬性和表中的字段是一一對(duì)應(yīng)的。2.2Hibernate各種文件的作用Hibernate使用*.hbm.xml映射文件將這些POJO類(lèi)中的屬性映射到數(shù)據(jù)表中(本例就是Kcb.hbm.xml)數(shù)據(jù)表2.2Hibernate各種文件的作用該配置文件大致分為3個(gè)部分:(1)類(lèi)、表映射配置

<classname="org.model.Kcb"table="KCB">Name:指定POJO類(lèi)Table:指定當(dāng)前類(lèi)對(duì)應(yīng)數(shù)據(jù)表2.2Hibernate各種文件的作用(2)id映射配置<idname="kch"type="java.lang.String"> <columnname="KCH"length="3"/> <generatorclass="assigned"/></id>Id:定義數(shù)據(jù)庫(kù)表主鍵Name:指定類(lèi)中的屬性映射字段Column:指定當(dāng)前映射表KCB的列。type:當(dāng)前字段的數(shù)據(jù)類(lèi)型<generatorclass=“assigned”/>指定主鍵生成方式2.2Hibernate各種文件的作用Hibernate的主鍵生成策略:Hibernate對(duì)主鍵id賦值應(yīng)用程序自身對(duì)id賦值(assigned)由數(shù)據(jù)庫(kù)對(duì)id賦值。Assigned例:Kcbkc=newKcb(); //創(chuàng)建POJO類(lèi)對(duì)象kc.setKch("198"); //設(shè)置課程號(hào)kc.setKcm("機(jī)電"); //設(shè)置課程名kc.setKxxq(newInteger(5).shortValue()); //設(shè)置開(kāi)學(xué)學(xué)期kc.setXf(newInteger(4).shortValue()); //設(shè)置學(xué)分kc.setXs(newInteger(59).shortValue()); //設(shè)置學(xué)時(shí)2.2Hibernate各種文件的作用native:由數(shù)據(jù)庫(kù)對(duì)id賦值。當(dāng)設(shè)置<generatorclass="native"/>時(shí),數(shù)據(jù)庫(kù)負(fù)責(zé)主鍵id的賦值,最常見(jiàn)的是int型的自增型主鍵。hilo:通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫(kù)表保存主鍵生成歷史狀態(tài)。seqhilo:與hi/lo類(lèi)似,通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,只是主鍵歷史狀態(tài)保存在sequence中,適用于支持sequence的數(shù)據(jù)庫(kù),如Oracle。increment:主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為主鍵。identity:采用數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制,如SQLServer、MySQL中的自增主鍵生成機(jī)制。sequence:采用數(shù)據(jù)庫(kù)提供的sequence機(jī)制生成主鍵,如Oraclesequence。uuid.hex:由Hibernate基于128位唯一值產(chǎn)生算法,根據(jù)當(dāng)前設(shè)備IP、時(shí)間、JVM啟動(dòng)時(shí)間、內(nèi)部自增量等4個(gè)參數(shù)生成十六進(jìn)制數(shù)值(編碼后長(zhǎng)度為32位的字符串表示)作為主鍵。即使是在多實(shí)例并發(fā)運(yùn)行的情況下,這種算法在最大程度上保證了產(chǎn)生id的唯一性。當(dāng)然,重復(fù)的概率在理論上依然存在,只是概率比較小。uuid.string:與uuid.hex類(lèi)似,只是對(duì)生成的主鍵進(jìn)行編碼(長(zhǎng)度16位)。foreign:使用外部表的字段作為主鍵。select:Hibernate3新引入的主鍵生成機(jī)制,主要針對(duì)遺留系統(tǒng)的改造工程。2.2Hibernate各種文件的作用(3)屬性、字段映射配置屬性、字段映射將映射類(lèi)屬性與庫(kù)表字段相關(guān)聯(lián)。<propertyname="kcm"type="java.lang.String"> <columnname="KCM"length="12"/></property>2.2Hibernate各種文件的作用2.hibernate.cfg.xml文件該配置文件主要是配置SessionFractory類(lèi)。2.2Hibernate各種文件的作用

3.HibernateSessionFactoryHibernateSessionFactory類(lèi)是自定義的SessionFactory2.2Hibernate各種文件的作用Session對(duì)象的創(chuàng)建:①初始化Hibernate配置管理類(lèi)Configuration。②通過(guò)Configuration類(lèi)實(shí)例創(chuàng)建Session的工廠類(lèi)SessionFactory。③通過(guò)SessionFactory得到Session實(shí)例。2.3Hibernate核心接口1.Configuration接口Configuration負(fù)責(zé)管理Hibernate的配置信息。初始化:hibernate.cfg.xml中設(shè)定屬性:Configurationconfig=newConfiguration().configure();Hibernate會(huì)自動(dòng)在目錄下搜索hibernate.cfg.xml文件,并將其讀取到內(nèi)存中作為后續(xù)操作的基礎(chǔ)配置2.3Hibernate核心接口2.SessionFactory接口構(gòu)建SessionFactory:Configurationconfig=newConfiguration().configure();SessionFactorysessionFactory=config.buildSessionFactory();SessionFactory一旦構(gòu)造完畢,即被賦予特定的配置信息。之后config的任何變更將不會(huì)影響到已經(jīng)創(chuàng)建的SessionFactory實(shí)例2.3Hibernate核心接口3.Session接口Session是Hibernate持久化操作的基礎(chǔ)HibernateSession的設(shè)計(jì)是非線程安全的。Session實(shí)例由SessionFactory構(gòu)建:Configurationconfig=newConfiguration().configure();SessionFactorysessionFactory=config.buldSessionFactory();Sessionsession=sessionFactory.openSession();2.3Hibernate核心接口4.Transaction接口事務(wù)操作的接口可以讓開(kāi)發(fā)者能夠使用一個(gè)統(tǒng)一的操作界面方便項(xiàng)目在不同環(huán)境和容器之間移值事務(wù)對(duì)象通過(guò)Session創(chuàng)建:Transactionts=session.beginTransaction();2.3Hibernate核心接口5.Query接口Query接口代替Hibernate2.x中find()方法執(zhí)行HQL語(yǔ)句。Queryquery=session.createQuery(“fromKcbwherekch=198”);例如:Queryquery=session.createQuery("fromKcbwherekch=?");Query.setString(0,"要設(shè)置的值");2.3Hibernate核心接口也可以用“:”Queryquery=session.createQuery("fromKcbwherekch=:kchValue");Query.setString("kchValue","要設(shè)置的課程號(hào)值");也可以:Query.setParameter(0,"要設(shè)置的值");list():用于取得一個(gè)List集合的示例,例如:Queryquery=session.createQuery("fromKcbwherekch=198");Listlist=query.list();2.4HQL查詢HQL是HibernateQueryLanguage的縮寫(xiě)HQL語(yǔ)法很像SQL,但HQL是一種面向?qū)ο蟮牟樵冋Z(yǔ)言:SQL的操作對(duì)象是數(shù)據(jù)表和列等數(shù)據(jù)對(duì)象HQL的操作對(duì)象是類(lèi)、實(shí)例、屬性等HQL的查詢依賴與Query類(lèi),每個(gè)Query實(shí)例對(duì)應(yīng)一個(gè)查詢對(duì)象,例如:Queryquery=session.createQuery(“fromKcbwherekch=198”);createQuery方法中的字符串就是HQL語(yǔ)句2.4HQL查詢HQL的幾種常用查詢方式:1.基本查詢例如:(1)查詢所有課程信息…Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();Queryquery=session.createQuery("fromKcb");Listlist=query.list();mit();HibernateSessionFactory.closeSession();…上述代碼片段,得到List對(duì)象,可遍歷該對(duì)象得出每條課程信息2.4HQL查詢(2)查詢某門(mén)課程信息...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();//查詢一門(mén)學(xué)時(shí)最長(zhǎng)的課程Queryquery=session.createQuery("fromKcborderbyxsdesc");query.setMaxResults(1); //設(shè)置最大檢索數(shù)目為1//裝載單個(gè)對(duì)象Kcbkc=(Kcb)query.uniqueResult();mit();HibernateSessionFactory.closeSession();...上述代碼可得到單個(gè)對(duì)象“kc”2.4HQL查詢(3)查詢滿足條件的課程信息...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();//查詢課程號(hào)為001的課程信息Queryquery=session.createQuery("fromKcbwherekch=001");Listlist=query.list();mit();HibernateSessionFactory.closeSession();...上述代碼,遍歷List對(duì)象,查詢所有滿足條件的課程信息2.4HQL查詢2.條件查詢(1)按指定參數(shù)查詢...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();//查詢課程名為計(jì)算機(jī)基礎(chǔ)的課程信息Queryquery=session.createQuery("fromKcbwherekcm=?");query.setParameter(0,"計(jì)算機(jī)基礎(chǔ)");Listlist=query.list();mit();HibernateSessionFactory.closeSession();...得到復(fù)合條件的List集合2.4HQL查詢(2)使用范圍運(yùn)算查詢...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();//查詢這樣的課程信息,課程名為計(jì)算機(jī)基礎(chǔ)或數(shù)據(jù)結(jié)構(gòu),且學(xué)//時(shí)在40~60之間Queryquery=session.createQuery("fromKcbwhere(xsbetween40and60)andkcmin('計(jì)算機(jī)基礎(chǔ)','數(shù)據(jù)結(jié)構(gòu)')");Listlist=query.list();mit();HibernateSessionFactory.closeSession();...2.4HQL查詢(3)使用比較運(yùn)算符查詢...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();//查詢學(xué)時(shí)大于51且課程名不為空的課程信息Queryquery=session.createQuery("fromKcbwherexs>51andkcmisnotnull");Listlist=query.list();mit();HibernateSessionFactory.closeSession();...2.4HQL查詢(4)使用字符串匹配運(yùn)算查詢...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();//查詢課程號(hào)中包含“001”字符串且課程名前面三個(gè)字為計(jì)算機(jī)的所有課程信息Queryquery=session.createQuery("fromKcbwherekchlike'%001%'andkcmlike'計(jì)算機(jī)%'");Listlist=query.list();mit();HibernateSessionFactory.closeSession();...2.4HQL查詢3.分頁(yè)查詢?yōu)榱藵M足分頁(yè)查詢的需要,Hibernate的Query實(shí)例提供了兩種方法:setFirstResult(intfirstResult)方法用于指定從哪一個(gè)對(duì)象開(kāi)始查詢(序號(hào)從0開(kāi)始),默認(rèn)為第1個(gè)對(duì)象,也就是序號(hào)0。setMaxResults(intmaxResult)方法用于指定一次最多查詢出的對(duì)象的數(shù)目,默認(rèn)為所有對(duì)象。2.4HQL查詢例如:...Sessionsession=HibernateSessionFactory.getSession();Transactionts=session.beginTransaction();Queryquery=session.createQuery("fromKcb");intpageNow=1; //想要顯示第幾頁(yè)intpageSize=5; //每頁(yè)顯示的條數(shù)query.setFirstResult((pageNow-1)*pageSize);//指定從哪一個(gè)對(duì)象開(kāi)始查詢query.setMaxResults(pageSize); //指定最大的對(duì)象數(shù)目Listlist=query.list();mit();HibernateSessionFactory.closeSession();...3Hibernate關(guān)系映射字段名稱數(shù)據(jù)類(lèi)型主鍵自增允許為空描述IDint(4)是ID號(hào)USERNAMEvarchar(20)登錄賬號(hào)PASSWORDvarchar(20)登錄密碼字段名稱數(shù)據(jù)類(lèi)型主鍵自增允許為空描述IDint(4)是增1ID號(hào)TRUENAMEvarchar(8)是真實(shí)姓名EMAILvarchar(50)是電子郵件表1登錄表Login表2詳細(xì)信息表Detail3.1一對(duì)一關(guān)聯(lián)1.共享主鍵方式例:注冊(cè)某個(gè)論壇會(huì)員詳細(xì)信息表:3.1一對(duì)一關(guān)聯(lián)構(gòu)建共享主鍵的一對(duì)一關(guān)聯(lián):①創(chuàng)建Java項(xiàng)目,命名為“Hibernate_mapping”②添加Hibernate開(kāi)發(fā)能力,步驟同2.1節(jié)第4步③編寫(xiě)生成數(shù)據(jù)庫(kù)表對(duì)應(yīng)的Java類(lèi)對(duì)象和映射文件。Login表對(duì)應(yīng)的POJO類(lèi)Login.java:packageorg.model;publicclassLoginimplementsjava.io.Serializable{ privateintid; //ID號(hào) privateStringusername; //登錄賬號(hào) privateStringpassword; //密碼

privateDetaildetail; //詳細(xì)信息 //省略上述各屬性的getter和setter方法}3.1一對(duì)一關(guān)聯(lián)Detail表對(duì)應(yīng)的Detail.java:packageorg.model;publicclassDetailimplementsjava.io.Serializable{ privateintid; //ID號(hào) privateStringtrueName; //真實(shí)姓名 privateStringemail; //電子郵件

privateLoginlogin; //登錄信息 //省略上述各屬性的getter和setter方法}3.1一對(duì)一關(guān)聯(lián)Login表與Login類(lèi)的ORM映射Login.hbm.xml。參數(shù)3.1一對(duì)一關(guān)聯(lián)Detail表與Detail類(lèi)的ORM映射Detail.hbm.xml:參數(shù)3.1一對(duì)一關(guān)聯(lián)

④在hibernate.cfg.xml文件中加入配置映射文件的語(yǔ)句。<mappingresource="org/model/Detail.hbm.xml"/><mappingresource="org/model/Login.hbm.xml"/>⑤創(chuàng)建測(cè)試類(lèi)。在src文件夾下創(chuàng)建包test,在該包下建立測(cè)試類(lèi),命名為“Test.java”。3.1一對(duì)一關(guān)聯(lián)⑥運(yùn)行程序,測(cè)試結(jié)果。圖12Login表圖13Detail表3.1一對(duì)一關(guān)聯(lián)字段名稱數(shù)據(jù)類(lèi)型主鍵自增允許為空描述Idint是增1ID號(hào)namevarchar(20)姓名room_idint(20)是房間號(hào)字段名稱數(shù)據(jù)類(lèi)型主鍵自增允許為空描述idint(4)是增1ID號(hào)addressvarchar(100)地址表3Person表表4Room表2.唯一外鍵方式對(duì)應(yīng)的Person表和Room表如表3、表4所示。3.1一對(duì)一關(guān)聯(lián)步驟如下:①在項(xiàng)目Hibernate_mapping的org.model包下編寫(xiě)生成數(shù)據(jù)庫(kù)表對(duì)應(yīng)的Java類(lèi)對(duì)象和映射文件。Person表對(duì)應(yīng)的POJO類(lèi)Person.java:packageorg.model;publicclassPersonimplementsjava.io.Serializable{privateIntegerid;privateStringname;privateRoomroom;//省略上述各屬性的getter和setter方法}Room表對(duì)應(yīng)的POJO類(lèi)Room.java:packageorg.model;publicclassRoomimplementsjava.io.Serializable{privateintid;privateStringaddress;privatePersonperson;//省略上述各屬性的getter和setter方法}3.1一對(duì)一關(guān)聯(lián)Person表與Person類(lèi)的ORM映射文件Person.hbm.xml:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="org.model.Person"table="Person"><idname="id"column="id"type="java.lang.Integer">

<generatorclass="native"/></id><propertyname="name"column="name"type="java.lang.String"/><many-to-onename="room" //屬性名稱column="room_id" //充當(dāng)外鍵的字段名class="org.model.Room" //被關(guān)聯(lián)的類(lèi)的名稱cascade="all" //主控類(lèi)所有操作,對(duì)關(guān)聯(lián)類(lèi)也執(zhí)行同樣操作

unique="true"/> //唯一性約束,實(shí)現(xiàn)一對(duì)一</class></hibernate-mapping>參數(shù)3.1一對(duì)一關(guān)聯(lián)Room表與Room類(lèi)的ORM映射文件Room.hbm.xml:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="org.model.Room"table="Room"><idname="id"column="id"><generatorclass="native"/></id> <propertyname="address" column="address"type="java.lang.String"/> <one-to-onename="person" //屬性名class="org.model.Person" //被關(guān)聯(lián)的類(lèi)的名稱property-ref="room"/> //指定關(guān)聯(lián)類(lèi)的屬性名</class></hibernate-mapping>3.1一對(duì)一關(guān)聯(lián)②在hibernate.cfg.xml文件中加入如下的配置映射文件的語(yǔ)句<mappingresource="org/model/Person.hbm.xml"/><mappingresource="org/model/Room.hbm.xml"/>③編寫(xiě)測(cè)試代碼。在src文件夾下的包test的Test類(lèi)中加入如下代碼:…Personperson=newPerson();person.setName("liumin");Roomroom=newRoom();room.setAddress("NJ-S1-328");person.setRoom(room);session.save(person);…3.1一對(duì)一關(guān)聯(lián)④運(yùn)行程序,測(cè)試結(jié)果。

圖14Person表圖15Room表3.2多對(duì)一單向關(guān)聯(lián)①同上例,對(duì)應(yīng)表不變,Person表對(duì)應(yīng)的類(lèi)也不變,對(duì)應(yīng)的Person.hbm.xml文件修改如下:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="org.model.Person"table="Person"><idname="id"column="id"type="java.lang.Integer"><generatorclass="native"/></id><propertyname="name"column="name"type="java.lang.String"/><many-to-onename="room" //屬性名稱 column="room_id" //充當(dāng)外鍵的字段名 class="org.model.Room" //被關(guān)聯(lián)的類(lèi)的名稱 cascade="all"/> //主控類(lèi)所有操作,對(duì)關(guān)聯(lián)類(lèi)也執(zhí)行同樣操作</class></hibernate-mapping>3.2多對(duì)一單向關(guān)聯(lián)Room表不變,對(duì)應(yīng)的POJO類(lèi)如下:packageorg.model;publicclassRoomimplementsjava.io.Serializable{privateintid;privateStringaddress;//省略上述各屬性的getter和setter方法}3.2多對(duì)一單向關(guān)聯(lián)Room表與Room類(lèi)的ORM映射文件Room.hbm.xml如下:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="org.model.Room"table="room"><idname="id"column="id"><generatorclass="native"/></id><propertyname="address"column="address"type="java.lang.String"/></class></hibernate-mapping>3.2多對(duì)一單向關(guān)聯(lián)②編寫(xiě)測(cè)試代碼。在src文件夾下的包test的Test類(lèi)中加入如下代碼:

…Roomroom=newRoom();room.setAddress("NJ-S1-328");Personperson=newPerson();person.setName("liuyanmin");person.setRoom(room);session.save(person);…注意:在session.save方法完成person的插入工作,則插入同時(shí)room對(duì)象也被插入到數(shù)據(jù)庫(kù)中。但是反過(guò)來(lái),如果直接插入Room對(duì)象,這person沒(méi)有影響3.2多對(duì)一單向關(guān)聯(lián)③運(yùn)行程序,測(cè)試結(jié)果。

圖17Room表圖16Person表3.3一對(duì)多雙向關(guān)聯(lián)讓“一”的一方也知道“多“的一方①在項(xiàng)目Hibernate_mapping的org.model包下編寫(xiě)生成數(shù)據(jù)庫(kù)表對(duì)應(yīng)的Java類(lèi)對(duì)象和映射文件。Person表對(duì)應(yīng)的POJO及其映射文件不用改變,只需修改Room表對(duì)應(yīng)的POJO類(lèi)及其映射文件。對(duì)應(yīng)的POJO類(lèi)Room.java

3.3一對(duì)多雙向關(guān)聯(lián)Room表與Room類(lèi)的ORM映射文件Room.hbm.xml。3.3一對(duì)多雙向關(guān)聯(lián)該配置文件中cascade配置的是級(jí)聯(lián)程度,它有以下幾種取值:all:表示所有操作句在關(guān)聯(lián)層級(jí)上進(jìn)行連鎖操作。save-update:表示只有save和update操作進(jìn)行連鎖操作。delete:表示只有delete操作進(jìn)行連鎖操作。all-delete-orphan:在刪除當(dāng)前持久化對(duì)象時(shí),它相當(dāng)于delete;在保存或更新當(dāng)前持久化對(duì)象時(shí),它相當(dāng)于save-update。另外它還可以刪除與當(dāng)前持久化對(duì)象斷開(kāi)關(guān)聯(lián)關(guān)系的其他持久化對(duì)象。3.3一對(duì)多雙向關(guān)聯(lián)②編寫(xiě)測(cè)試代碼。在src文件夾下的包test的Test類(lèi)中加入如下代碼:…Personperson1=newPerson();Personperson2=newPerson();Roomroom=newRoom();room.setAddress("NJ-S1-328");person1.setName("李方方");person2.setName("王艷");person1.setRoom(room);person2.setRoom(room);//這樣完成后就可以通過(guò)Session對(duì)象//調(diào)用session.save(person1)和session.save(person)//會(huì)自動(dòng)保存roomsession.save(person1);session.save(person2);…3.3一對(duì)多雙向關(guān)聯(lián)③運(yùn)行程序,測(cè)試結(jié)果。因?yàn)樵摮绦驗(yàn)镴avaApplication,所以可以直接運(yùn)行。在完全沒(méi)有操作數(shù)據(jù)庫(kù)的情況下,程序就完成了對(duì)數(shù)據(jù)的插入。插入數(shù)據(jù)后,Person表和Room表的內(nèi)容如圖18、圖19所示。

圖4.18Person表圖4.19Room表3.3一對(duì)多雙向關(guān)聯(lián)由于是雙向的,當(dāng)然也可以從Room的一方來(lái)保存Person,在Test.java中加入如下代碼:...Personperson1=newPerson();Personperson2=newPerson();Roomroom=newRoom();person1.setName("李方方");person2.setName("王艷");Setpersons=newHashSet();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...3.3一對(duì)多雙向關(guān)聯(lián)運(yùn)行程序,插入數(shù)據(jù)后,Person表和Room表的內(nèi)容如圖20、圖21所示。

圖4.20Person表圖4.21Room表3.4多對(duì)多關(guān)聯(lián)字段名稱數(shù)據(jù)類(lèi)型主鍵自增允許為空描述IDint是增1ID號(hào)SNUMBERvarchar(10)學(xué)

溫馨提示

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