關聯關系映射_第1頁
關聯關系映射_第2頁
關聯關系映射_第3頁
關聯關系映射_第4頁
關聯關系映射_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Hibernate高級應用( 視頻講解:107分鐘)目前,持久層框架并非只有Hibernate,但在眾多持久層框架中,Hibernate憑借著其強大的功能、輕量級的實現、成熟的結構體系等諸多優點從中脫穎而出,在Java編程中得到了廣泛的應用。本章將在第14章的基礎上,對其進行更加深入的講解。通過閱讀本章,您可以::掌握實體對象關系的建立:掌握關聯關系的映射方法:理解單向關聯與雙向關聯:掌握對象間的級聯操作:掌握繼承映射:掌握HQL查詢語言15.1關聯關系映射視頻講解:光盤\TM\Video\15\關聯關系映射.exeHibernate框架是一個ORM框架,它以面向對象的編程方式操作數據庫。在Hibernate中,“映射”發揮著巨大的作用,它將實體對象映射成數據表,實體對象的屬性被映射為表中的字段,同樣其實體之間的關聯關系也是通過“映射”實現的。15.1.1單向關聯與雙向關聯在Hibernate框架中,實體對象之間的關系可分為一對一、多對一等關聯關系,其關聯類型主要分為“單向關聯”與“雙向關聯”。(1) 單向關聯單向關聯指具有關聯關系的實體對象之間的加載關系是單向的。它意味著,在具有關聯關系的兩個實體對象中,只有一個實體對象可以訪問對方。如圖15.1所示,從學生對象中可以加載到班級信息,反過來則不行。(2) 雙向關聯

雙向關聯指具有關聯關系的實體對象之間的加載關系是雙向的。它意味著,在具有關聯關系的兩個實體對象中,彼此都可以訪問對方。如圖15.2所示,從學生對象中可以加載到班級信息,從班級對象中也可加載到學生的信息。,學生 A現霸圖15.1單向關聯學生.■現取圖15.2雙向關聯15.1.2多對一單向關聯映射多對一單向關聯映射十分常見,在學習其映射方法之前,首先來了解一下多對一單向關聯的實體。如圖15.3所示,圖書對象(Book)與圖書類別對象(Category)為多對一的關聯關系,多本圖書對應一個類別,在Book對象中擁有Category的引用,它可以加載到一本圖書的所屬類別,而在Category的一端卻不能加載到圖書信息。對于多對一單向關聯映射,Hibernate會在多的一端加入外鍵與一的一端建立關聯關系,其映射后的數據表如圖15.4所示。圖15.3多對一單向關聯的實體對象圖15.4映射后的數據表例15.01建立圖書對象(Book)與圖書類別對象(Category)的多對一關聯關系,通過單向關聯進行映射。其關鍵的映射代碼如下:(實例位置:光盤\TM\Instances\15.01)<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"/hibernate-mapping-3.0.dtd"><hibernate-mappingpackage="com.lyq.model"><classname="Book"table="tb_book_manytoone1"><!--主鍵--><idname="id"><generatorclass="native"/></id><!--圖書名稱--><propertyname="name"not-null="true"length="200"/><!--作者--><propertyname="author"not-null="true"length="50"/><!--多對一關聯映射--><many-to-onename="category"class="Category"><!--映射的字段--><columnname="categoryId"/></many-to-one></class></hibernate-mapping>Hibernate的多對一單向關聯是使用<many-to-one>標簽進行映射,此標簽用在多的一端。其中,name屬性用于指定持久化類中相對應的屬性名,class屬性指定與其關聯的對象。此外還需要指定數據表中所映射的字段,它使用子標簽<column>進行設置,〈column>標簽的name屬性用于一的一端的主鍵標識。創建ExportTables類,在main()方法中將數據表導出。其關鍵代碼如下:publicstaticvoidmain(String[]args){//加載配置信息Configurationcfg=newConfiguration().configure();〃實例化SchemaExport對象SchemaExportexport=newSchemaExport(cfg);

〃導出數據表export.create(true,true);}運行此類,將在數據庫中創建圖書信息表與圖書類別表。例15.02多對一單向關聯映射中對象的加載,代碼如下。(實例位置:光盤\TM\Instances\15.02)publicclassTest{publicstaticvoidmain(String[]args){Sessionsession=null; //聲明Session對象try{〃獲取Sessionsession=HibernateUtil.getSession();〃開啟事務session.beginTransaction();〃查詢圖書對象Bookbook=(Book)session.get(Book.class,newInteger(1));System.out.println("圖書名稱:"+book.getName());System.out.println("圖書類別:"+book.getCategory().getName());//提交事務session.getTransaction().commit();}catch(Exceptione){e.printStackTrace();〃出錯將回滾事務session.getTransaction().rollback();}finally{//關閉Session對象HibernateUtil.closeSession(session);本實例中,Book對象持有Category對象的引用,從Book對象中可以得到Category對象的屬性,實例運行結果如圖15.5所示。圖15.5圖15.5實例運行結果15.1.3多對一雙向關聯映射雙向關聯的實體對象都持有對方的引用,在任何一端都能加載到對方的信息。多對一雙向關聯映射實質是在多對一單向關聯的基礎上,加入了一對多關聯關系。下面仍以圖書對象(Book)與圖書類別對象(Category)為例,講解多對一雙向關聯映射,其實體關系如圖15.6所示。Eool-id. : intnaEe : Strinrauthor : String-ca.t : Catecor:圖15.6多對一雙向關聯的實體對象對于圖書類別對象Category,它擁有多個圖書對象的引用,因此需要在Category對象中加入Set屬性的圖書集合books,對于其映射文件也通過集合的方式進行映射。例15.03建立圖書對象(Book)與圖書類別對象(Category)的多對一關聯關系,通過雙向關聯進行映射,其中Book對象的映射文件與多對一單向關聯中一致,并沒有發生任何變化,而Category對象的映射文件通過<set>標簽進行映射。代碼如下:(實例位置:光盤\TM\Instances\15.03)<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"<hibernate-mappingpackage="com.lyq.model"><classname="Category"table="tb_Category_manytoone2"><!--主鍵--><idname="id"><generatorclass="native"/></id><!--類別名稱--><propertyname="name"not-null="true"length="200"/><!--—對多映射--><setname="books"><keycolumn="categoryId"/><one-to-manyclass="Book"/></set></class></hibernate-mapping><set>標簽用于映射集合類型的屬性,其中name屬性用于指定持久化類中的屬性名稱。此標簽通過子標簽<key>指定數據表中的關聯字段,對于一對多關聯映射通過<one-to-many>標簽進行映射,其class屬性用于指定相關聯的對象。創建ExportTables類,在main()方法中將數據表導出。其關鍵代碼如下:publicstaticvoidmain(String[]args){//加載配置信息Configurationcfg=newConfiguration().configure();〃實例化SchemaExport對象SchemaExportexport=newSchemaExport(cfg);〃導出數據表export.create(true,true);}運行此類,將在數據庫中創建圖書信息表與圖書類別表。

例15.04多對一雙向關聯映射中對象的加載,代碼如下:(實例位置:光盤\TM\Instances\15.04)publicclassTest{publicstaticvoidmain(String[]args){Sessionsession=null; //聲明Session對象try{〃獲取Sessionsession=HibernateUtil.getSession();〃開啟事務session.beginTransaction();System.out.println("*********查詢圖書對象************");〃查詢圖書對象Bookbook1=(Book)session.get(Book.class,newInteger(1));System.out.println("圖書名稱:"+book1.getName());System.out.println("圖書類別:"+book1.getCategory().getName());System.out.println("*********查詢類別對象************");〃查詢類別對象Categoryc=(Category)session.load(Category.class,newInteger⑴);System.out.println("類別名稱:"+c.getName());Set<Book>books=c.getBooks(); 〃獲取類別中的所有圖書//通過迭代輸出圖書名稱for(Iterator<Book>it=books.iterator();it.hasNext();){Bookbook2=(Book)it.next();System.out.println("圖書名稱:"+book2.getName());}//提交事務session.getTransaction().commit();

}catch(Exceptione){e.printStackTrace();〃出錯將回滾事務session.getTransaction().rollback();}finally{//關閉Session對象HibernateUtil.closeSession(session);}}}由于配置了圖書與類別之間的多對一雙向關聯映射,所以Book對象與Category對象都持有對方的引用。圖書類別屬于多對一中一的一端,在一個類別中擁有多本圖書,Hibernate使用Set集合進行映射,因此當加載一個類別時,可以加載到類別中的所有圖書。實例運行結果如圖15.7所示。圖15.7實例運行結果15.1.4一對一主鍵關聯映射用戶與身份證之間是一對一的關聯關系,每一個用戶對應一個身份證,同樣每一個身份證也對應一個用戶。在Hibernate中,可將一對一關聯映射分為主鍵關聯映射與外鍵關聯映射。使用一對一主鍵關聯映射時,其數據表的結構如圖15.8所示。從圖15.8可以看出,IdCard的主鍵參照了User的外鍵,它與User對象的主鍵是一一對應的關系。同樣,Hibernate的一對一主鍵關聯映射也分為單向與雙向映射。下面以雙向映射為例進行講解,其實體間的關系如圖15.9所示。

numvdrcharlSO)typfvarchsrOO)圖15.8表關系numvdrcharlSO)typfvarchsrOO)圖15.8表關系圖15.9實體關系例15.05用戶(User)對象與證件(IdCard)對象為一對一的關聯關系,二者之間通過一對一主鍵關聯映射。其中User的映射文件User.hbm.xml的關鍵代碼如下:(實例位置:光盤\TM\Instances\15.05)<hibernate-mapping><classname="com.lyq.model.User"table="tb_user_onetoone_p"><!--主鍵id--><idname="id"><generatorclass="native"/></id><!--姓名--><propertyname="username"not-null="true"/><!--年齡--><propertyname="age"/><!--—對一映射--><one-to-onename="idCard"/></class></hibernate-mapping>IdCard對象的主鍵參照了User對象的外鍵,其映射文件IdCard.hbm.xml的關鍵代碼如下。<hibernate-mapping><classname="com.lyq.model.IdCard"table="tb_idCard_onetoone_p">

<idname="id"><!--參考User的外鍵--><generatorclass="foreign"><paramname="property">user</param></generator></id><!--證件號--><propertyname="num"not-null="true"/><!--—對一映射--><one-to-onename="user"constrained="true"/></class></hibernate-mapping><one-to-one>標簽用于建立一對一關聯映射,其中name屬性用于指定持久化類中的屬性名稱;constrained屬性用于建立一個約束,它表明IdCard對象的主鍵參照了User的外鍵。IdCard的主鍵生成策略為foreign,此種方式通過<parm>標簽配置主鍵的來源。創建ExportTables類,在main()方法中將數據表導出。其關鍵代碼如下:publicstaticvoidmain(String[]args){//加載配置信息Configurationcfg=newConfiguration().configure();〃實例化SchemaExport對象SchemaExportexport=newSchemaExport(cfg);〃導出數據表export.create(true,true);}運行此類,將在數據庫中創建用戶表與證件表。

15.1.5一對一外鍵關聯映射除一對一主鍵關聯映射外,還有一對一外鍵關聯映射。這種映射方式在其中一端加入一個外鍵指向另一端,其映射后形成的數據表如圖15.10所示。U=?l-IXaixlM irri.t■?jiiclurIrrtixKsidirrlMint 淮Ttniflyav:hu*圖15.10表關系從圖15.10中可以看出,這種映射方式與多對一映射方式相似,如果能限制User對象中IdCard的唯一性,那么二者之間實質上就構成了一對一關聯關系。例15.06用戶(User)對象與證件(IdCard)對象為一對一的關聯關系,在二者之間建立一對一外鍵關聯映射。其中IdCard的映射文件IdCard.hbm.xml的關鍵代碼如下:(實例位置:光盤\TM\Instances\15.06)<hibernate-mapping><classname="com.lyq.model.IdCard"table="tb_idCard_onetoone_f"><!--主鍵id--><idname="id"><generatorclass="native"/></id><!--證件號--><propertyname="num"not-null="true"/></class></hibernate-mapping>User對象的映射文件User.hbm.xml的關鍵代碼如下:<hibernate-mapping><classname="com.lyq.model.User"table="tb_user_onetoone_f"><!--主鍵id--><idname="id"><generatorclass="native"/></id>

<propertyname="username"not-null="true"/><!--年齡--><propertyname="age"/><!--—對一映射--><many-to-onename="idCard"unique="true"/></class></hibernate-mapping>在IdCard對象的映射文件中,并沒有發生太大的變化,它只不過進行了普通的映射。而User對象的映射文件中,使用了<many-to-one>標簽進行了映射,此標簽用于多對一映射,但其unique屬性可以限制其關聯的唯一性,從而構成了一對一唯一外鍵關聯映射。創建ExportTables類,在main()方法中將數據表導出,運行此類,將在數據庫中創建用戶表與證件表。15.1.6多對多關聯映射Hibernate的多對多關聯映射與多對一及一對一等映射方式不同,它需要借助于第三張表進行實現。比如學生和課程之間是多對多的關系,一個學生可以選修多門課程,而一門課程又可以被多個學生選修。對于此種關系,Hibernate分別用兩個實體的標識映射出第三張表,用此表來維護學生與課程之間的多對多關系,如圖15.11所示。圖15.11表關系由于對象之間存在的是多對多的關系,彼此都可以擁有對方的多個引用,因此在設計持久化類中加入Set集合。例15.07建立學生對象與課程對象雙向多對多關聯關系映射,其中學生的持久化類為Studento其關鍵代碼如下。(實例位置:光盤\TM\Instances\15.07)publicclassStudent{

privateIntegerid; //IDprivateStringname; //姓名privateIntegerage; //年齡privateSet<Course>course;〃課程集合//省略getXXX()與setXXX()方法}課程的持久化類為Course,其關鍵代碼如下:publicclassCourse{privateIntegerid; //IDprivateStringname; 〃課程名稱privateSet<Student>students; 〃學生集合//省略getXXX()與setXXX()方法}Student對象的映射文件為Student.hbm.xml,其關鍵代碼如下。<hibernate-mappingpackage="com.lyq.model"><classname="Student"table="tb_student_manytomany"><!--主鍵id--><idname="id"><generatorclass="native"/></id><!--姓名--><propertyname="name"not-null="true"/><!--年齡--><propertyname="age"/><setname="course"table="tb_student_course"><keycolumn="studentId"></key><many-to-manyclass="Course"column="courseId"/></set>

</class></hibernate-mapping>Course對象的映射文件為Course.hbm.xml,其關鍵代碼如下。<hibernate-mapping><classname="com.lyq.model.Course"table="tb_course_manytomany"><!--主鍵id--><idname="id"><generatorclass="native"/></id><!--姓名--><propertyname="name"not-null="true"/><!--多對多映射--><setname="students"table="tb_student_course"><keycolumn="courseId"/><many-to-manyclass="com.lyq.model.Student"column="studentId"/></set></class></hibernate-mapping>多對多關聯映射中,使用<set>標簽進行集合的映射,其table屬性用于指定所映射的第三張表,其子標簽<key>指定第三張表所形成的字段,子標簽<many-to-many>映射多對多的關聯關系。<many-to-many>標簽的class屬性指定關聯的對象,column指定所關聯的字段。由于本實例中使用的是雙向多對多關聯關系映射,所以在課程對象Course與學生對象Student中都要通過<set>標簽進行映射。創建ExportTables類,在main()方法中將數據表導出,運行此類,將在數據庫中創建3張表。15.1.7級聯操作在關聯中的使用

在數據庫操作中,級聯操作經常被用到,如級聯更新、級聯刪除等操作。針對級聯操作,Hibernate提供了相應的方法,它通過在映射文件中配置cascade屬性來實現,其可選值有4種情況,如表15.1所示。表15.1cascade屬性的可選值及說明可選值說明none默認值,不進行級聯操作save-update當保存或更新當前對象時,級聯保存或更新關聯對象delete當刪除當前對象時,級聯刪除關聯對象all當保存、更新或刪除當前對象時,級聯保存、更新或刪除關聯對象例15.08圖書對象B

溫馨提示

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

評論

0/150

提交評論