JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第1頁
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第2頁
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第3頁
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第4頁
JavaEE核心技術(shù)(第7章 數(shù)據(jù)持久化Hibernate)_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

④在hibernate.cfg.xml文件中加入配置映射文件的語句。<mappingresource="org/model/Detail.hbm.xml"/><mappingresource="org/model/Login.hbm.xml"/>⑤創(chuàng)建測試類。在src文件夾下創(chuàng)建包test,在該包下建立測試類,命名為“Test.java”。3.1一對一關(guān)聯(lián)⑥運行程序,測試結(jié)果。圖12Login表圖13Detail表3.1一對一關(guān)聯(lián)字段名稱數(shù)據(jù)類型主鍵自增允許為空描述Idint是增1ID號namevarchar(20)姓名room_idint(20)是房間號字段名稱數(shù)據(jù)類型主鍵自增允許為空描述idint(4)是增1ID號addressvarchar(100)地址表3Person表表4Room表2.唯一外鍵方式對應(yīng)的Person表和Room表如表3、表4所示。3.1一對一關(guān)聯(lián)步驟如下:①在項目Hibernate_mapping的org.model包下編寫生成數(shù)據(jù)庫表對應(yīng)的Java類對象和映射文件。Person表對應(yīng)的POJO類Person.java:packageorg.model;publicclassPersonimplementsjava.io.Serializable{privateIntegerid;privateStringname;privateRoomroom;//省略上述各屬性的getter和setter方法}Room表對應(yīng)的POJO類Room.java:packageorg.model;publicclassRoomimplementsjava.io.Serializable{privateintid;privateStringaddress;privatePersonperson;//省略上述各屬性的getter和setter方法}3.1一對一關(guān)聯(lián)Person表與Person類的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)的類的名稱cascade="all" //主控類所有操作,對關(guān)聯(lián)類也執(zhí)行同樣操作

unique="true"/> //唯一性約束,實現(xiàn)一對一</class></hibernate-mapping>參數(shù)3.1一對一關(guān)聯(lián)Room表與Room類的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)的類的名稱property-ref="room"/> //指定關(guān)聯(lián)類的屬性名</class></hibernate-mapping>3.1一對一關(guān)聯(lián)②在hibernate.cfg.xml文件中加入如下的配置映射文件的語句<mappingresource="org/model/Person.hbm.xml"/><mappingresource="org/model/Room.hbm.xml"/>③編寫測試代碼。在src文件夾下的包test的Test類中加入如下代碼:…Personperson=newPerson();person.setName("liumin");Roomroom=newRoom();room.setAddress("NJ-S1-328");person.setRoom(room);session.save(person);…3.1一對一關(guān)聯(lián)④運行程序,測試結(jié)果。

圖14Person表圖15Room表3.2多對一單向關(guān)聯(lián)①同上例,對應(yīng)表不變,Person表對應(yīng)的類也不變,對應(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)的類的名稱 cascade="all"/> //主控類所有操作,對關(guān)聯(lián)類也執(zhí)行同樣操作</class></hibernate-mapping>3.2多對一單向關(guān)聯(lián)Room表不變,對應(yīng)的POJO類如下:packageorg.model;publicclassRoomimplementsjava.io.Serializable{privateintid;privateStringaddress;//省略上述各屬性的getter和setter方法}3.2多對一單向關(guān)聯(lián)Room表與Room類的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多對一單向關(guān)聯(lián)②編寫測試代碼。在src文件夾下的包test的Test類中加入如下代碼:

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

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

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

圖4.18Person表圖4.19Room表3.3一對多雙向關(guān)聯(lián)由于是雙向的,當(dāng)然也可以從Room的一方來保存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);//這樣完成后,就可以通過Session對象//調(diào)用session.save(room)//會自動保存person1和person2...3.3一對多雙向關(guān)聯(lián)運行程序,插入數(shù)據(jù)后,Person表和Room表的內(nèi)容如圖20、圖21所示。

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論