<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    多對多雙向關聯比較麻煩,一般添加第三個表變為兩個多對一進行處理,以學生和課程之間的關系為例,實體類和配置如下
    Course
     1 package domain;
     2 
     3 import java.util.Set;
     4 
     5 public class Course {
     6     
     7     private int id;
     8     private String name;
     9     
    10     private Set<StudentCourse> studentCourses;
    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 <hibernate-mapping>
     5     <class name="domain.Course" table="COURSE">
     6         <id name="id" type="int">
     7             <column name="ID" />
     8             <generator class="native" />
     9         </id>
    10         <property name="name" type="java.lang.String">
    11             <column name="NAME" />
    12         </property>
    13         <set name="studentCourses" inverse="true" lazy="extra">
    14             <key column="cid"/>
    15             <one-to-many class="domain.StudentCourse" />        
    16         </set>
    17     </class>
    18 </hibernate-mapping>
    19 

    Student
     1 package domain;
     2 
     3 import java.util.Set;
     4 
     5 public class Student {
     6     
     7     private int id;
     8     private String name;
     9     
    10     private Set<StudentCourse> studentCourses;
    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 <hibernate-mapping>
     5     <class name="domain.Student" table="STUDENT">
     6         <id name="id" type="int">
     7             <column name="ID" />
     8             <generator class="native" />
     9         </id>
    10         <property name="name" type="java.lang.String">
    11             <column name="NAME" />
    12         </property>
    13         <set name="studentCourses" inverse="true" lazy="extra">
    14             <key column="sid"/>
    15             <one-to-many class="domain.StudentCourse"/>
    16         </set>
    17     </class>
    18 </hibernate-mapping>
    19 

     1 package domain;
     2 
     3 public class StudentCourse {
     4     
     5     private int id;
     6     private int point;
     7     
     8     private Student student;
     9     private Course course;
    10     //get/set和構造省略,但實際不可省略
    11     
    12 }
    13 

     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 <hibernate-mapping>
     5     <class name="domain.StudentCourse" table="STUDENTCOURSE">
     6         <id name="id" type="int">
     7             <column name="ID" />
     8             <generator class="native" />
     9         </id>
    10         <property name="point" type="int">
    11             <column name="POINT" />
    12         </property>
    13         <many-to-one column="sid" name="student" class="domain.Student"/>
    14         <many-to-one column="cid" name="course" class="domain.Course"/>
    15     </class>
    16 </hibernate-mapping>
    17 
    書寫測試代碼
     1 package demo;
     2 
     3 import org.hibernate.Session;
     4 import org.junit.Test;
     5 
     6 import domain.Course;
     7 import domain.Student;
     8 import domain.StudentCourse;
     9 import util.HibernateUtil;
    10 
    11 public class App 
    12 {
    13 
    14     @Test
    15     /**
    16      * manyTomany中,需要添加第三個表來維護兩個提示之間的關系,但是一般來說,第三個表,還會添加其他的一些內容
    17      * 就比如,學生和課程之間的關系,在關系表中還會添加成績這一個字段
    18      */
    19     public void addTest() {
    20         Session session = null;
    21         try {
    22             session = HibernateUtil.openSession();
    23             session.beginTransaction();
    24             
    25             Student student = new Student();
    26             student.setName("二愣子");
    27             session.save(student);
    28             
    29             Student student2 = new Student();
    30             student2.setName("大棒槌");
    31             session.save(student2);
    32             
    33             Course course = new Course();
    34             course.setName("高達駕駛技術");
    35             session.save(course);
    36             
    37             Course course2 = new Course();
    38             course2.setName("外星語言");
    39             session.save(course2);
    40             
    41             StudentCourse studentCourse = new StudentCourse();
    42             studentCourse.setPoint(99);
    43             studentCourse.setStudent(student);
    44             studentCourse.setCourse(course);
    45             session.save(studentCourse);
    46             
    47             session.getTransaction().commit();
    48         } catch (Exception e) {
    49             if (session != null) {
    50                 session.getTransaction().rollback();
    51             }
    52         } finally {
    53             if (session != null) {
    54                 session.close();
    55             }
    56         }
    57     }
    58     
    59     @Test
    60     /**
    61      * 最佳實踐:多對多雙向關聯比較麻煩,不僅添加時需要很多操作,而且查詢的時候由于延遲加載會發很多sql
    62      * 實際應用中可以考慮直接使用原生sql查詢
    63      */
    64     public void addTest02() {
    65         Session session = null;
    66         try {
    67             session = HibernateUtil.openSession();
    68             session.beginTransaction();
    69             
    70             Student student = (Student) session.load(Student.class, 1);
    71             System.out.println(student.getName());
    72             
    73             for (StudentCourse s : student.getStudentCourses()) {
    74                 System.out.println(s.getCourse().getName() + ":" + s.getPoint());
    75             }
    76             
    77             session.getTransaction().commit();
    78         } catch (Exception e) {
    79             if (session != null) {
    80                 session.getTransaction().rollback();
    81             }
    82         } finally {
    83             if (session != null) {
    84                 session.close();
    85             }
    86         }
    87     }
    88 }
    89 

    posted on 2015-01-21 10:09 都較瘦 閱讀(86) 評論(0)  編輯  收藏 所屬分類: ORMFramework

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    公告

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

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 99久久精品毛片免费播放| 午夜亚洲WWW湿好爽| AAA日本高清在线播放免费观看| 免费精品国产自产拍观看| 久久精品熟女亚洲av麻豆| 日韩高清在线免费观看| 国产精品亚洲五月天高清| 四虎影视永久免费视频观看| 污网站在线观看免费| 亚洲精品国产日韩无码AV永久免费网 | 香港经典a毛片免费观看看| 国产精品成人免费综合| 国产精品自拍亚洲| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲裸男gv网站| 国产免费一区二区视频| 亚洲欧洲日韩不卡| 福利免费观看午夜体检区| 亚洲AV无码国产剧情| 亚洲午夜激情视频| 99久久国产免费中文无字幕| 亚洲国产精品网站久久| 免费高清资源黄网站在线观看 | 国产av无码专区亚洲av毛片搜| 亚洲国产一区二区三区| 久9这里精品免费视频| 亚洲制服丝袜中文字幕| 免费播放春色aⅴ视频| 久久永久免费人妻精品| 国产人成亚洲第一网站在线播放| 日本免费无遮挡吸乳视频电影| 一级人做人a爰免费视频| 久久亚洲春色中文字幕久久久 | 亚洲精品无码mv在线观看网站| 91av免费观看| 色吊丝免费观看网站| 亚洲色欲www综合网| 波多野结衣中文一区二区免费| 女人体1963午夜免费视频| 中文字幕精品三区无码亚洲| 久久激情亚洲精品无码?V|