溫故知新:hibernate_06_表關聯_多對一雙向關聯

          和多對一單向關聯類似,但是雙向關聯需要在關聯的兩方都添加配置。實體類和配置文件如下,還是以老師和學生為例。
          Student
           1 package domain;
           2 
           3 
           4 public class Student {
           5     
           6     private int id;
           7     private String name;
           8     private String grade;
           9     
          10     private Teacher teacher;
          11     
          12     //get/set和構造省略,但實際不可省
          13     
          14 }
          15 

           1 <?xml version="1.0"?>
           2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
           4 
           5 <hibernate-mapping>
           6     <class name="domain.Student" table="STUDENT">
           7         <id name="id" type="int">
           8             <column name="ID" />
           9             <generator class="native" />
          10         </id>
          11         <property name="name" type="java.lang.String">
          12             <column name="NAME" />
          13         </property>
          14         <property name="grade" type="java.lang.String">
          15             <column name="GRADE" />
          16         </property>
          17         <many-to-one name="teacher" class="domain.Teacher" fetch="join">
          18             <!-- 指定對方的外鍵 -->
          19             <column name="tid" />
          20         </many-to-one>
          21     </class>
          22 </hibernate-mapping>
          23 

          Teacher
           1 package domain;
           2 
           3 import java.util.HashSet;
           4 import java.util.Set;
           5 
           6 public class Teacher {
           7     
           8     private int id;
           9     private String name;
          10     private String course;
          11     
          12     private Set<Student> students;
          13     
          14      //get/set和構造省略,但實際不可省
          15 
          16 }
          17 

           1 <?xml version="1.0"?>
           2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
           4 
           5 <hibernate-mapping>
           6     <class name="domain.Teacher" table="TEACHER">
           7         <id name="id" type="int">
           8             <column name="ID" />
           9             <generator class="native" />
          10         </id>
          11         <property name="name" type="java.lang.String">
          12             <column name="NAME" />
          13         </property>
          14         <property name="course" type="java.lang.String">
          15             <column name="COURSE" />
          16         </property>
          17         <!-- lazy extra會增強查詢的功能,根據查詢的內容選擇查詢語句,比如查詢集合的數量會使用select count(*) -->
          18         <!-- inverse true表示由對方來維護關聯關系,也就是說,在學生對象設置老師屬性并保存之后,二者的關系會建立,教師不負責維護關系 -->
          19         <set name="students" lazy="extra" inverse="true">
          20             <key>
          21                 <!-- 指定需要關聯的外鍵,應和Student的設置一致 -->
          22                 <column name="tid" />
          23             </key>
          24             <one-to-many class="domain.Student"/>
          25         </set> 
          26     </class>
          27 </hibernate-mapping>
          28 
          書寫測試類
           1 package demo;
           2 
           3 import org.hibernate.Session;
           4 import org.junit.Test;
           5 
           6 import domain.Student;
           7 import domain.Teacher;
           8 import util.HibernateUtil;
           9 
          10 
          11 public class App 
          12 {
          13     @Test
          14     /**
          15      * oneToMany雙向關聯,設置多的一方維護關系。最佳實踐就是:先添加一的一方,之后再添加多的一方
          16      * 這樣不會造成冗余的sql
          17      */
          18     public void addTest() {
          19         Session session = null;
          20         try {
          21             session = HibernateUtil.openSession();
          22             session.beginTransaction();
          23 
          24             //添加一的一方
          25             Teacher teacher = new Teacher();
          26             teacher.setName("張老師");
          27             teacher.setCourse("物理");
          28             session.save(teacher);
          29             
          30             //添加多的一方,設置一的一方,因為多的一方需要維護關系
          31             Student stu1 = new Student();
          32             stu1.setName("小明");
          33             stu1.setGrade("一");
          34             stu1.setTeacher(teacher);
          35             session.save(stu1);
          36             
          37             Student stu2 = new Student();
          38             stu2.setName("小紅");
          39             stu2.setGrade("二");
          40             stu2.setTeacher(teacher);
          41             session.save(stu2);
          42             
          43             session.getTransaction().commit();
          44             
          45         } catch (Exception e) {
          46             if (session != null) {
          47                 session.getTransaction().rollback();
          48             }
          49         } finally{
          50             if (session != null) {
          51                 session.close();
          52             }
          53         }
          54     }
          55 }
          56 

          posted on 2015-01-20 19:38 都較瘦 閱讀(93) 評論(0)  編輯  收藏 所屬分類: ORMFramework

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          公告

          博客定位:囿于目前的水平,博客定位在記錄自己的學習心得和隨手的練習

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巴马| 萝北县| 乃东县| 仲巴县| 贞丰县| 唐河县| 阿坝县| 柳河县| 固始县| 罗江县| 瓮安县| 丰都县| 台江县| 拜城县| 盐边县| 东莞市| 咸宁市| 龙海市| 双辽市| 安塞县| 佛山市| 扶绥县| 南靖县| 东乌珠穆沁旗| 徐州市| 日喀则市| 乐平市| 武邑县| 五莲县| 舟曲县| 靖宇县| 营山县| 呼玛县| 富平县| 深泽县| 大名县| 肃南| 肇源县| 东港市| 嫩江县| 清徐县|