<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

    導航

    統計

    公告

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

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久久久久久91精品免费观看| 国产一级婬片A视频免费观看| 最近中文字幕免费mv在线视频| 亚洲精品制服丝袜四区| 在线视频网址免费播放| 亚洲国产系列一区二区三区 | 永久免费无码网站在线观看| 亚洲国产精品久久人人爱| 中文字幕视频免费| 亚洲天堂中文字幕在线观看| 久久精品免费全国观看国产| 亚洲大成色www永久网址| 手机看片久久国产免费| 亚洲AV日韩AV永久无码免下载| 亚洲乱码中文字幕小综合| 最近中文字幕无免费视频| 久久精品国产亚洲av瑜伽| 亚洲无码日韩精品第一页| 成人影片一区免费观看| 亚洲欧洲久久精品| 久久WWW色情成人免费观看| 亚洲天堂男人天堂| 无遮挡免费一区二区三区 | 怡红院免费的全部视频| 亚洲人成网www| 妞干网在线免费观看| 老司机亚洲精品影院无码| 午夜宅男在线永久免费观看网| 久久亚洲精品视频| 成人亚洲国产精品久久| 亚洲人成色777777在线观看 | 最近最新的免费中文字幕| 一级做a爰性色毛片免费| 亚洲avav天堂av在线不卡| 女人18毛片水真多免费播放| 黄床大片免费30分钟国产精品| 亚洲免费在线视频| 老司机永久免费网站在线观看| a级毛片在线免费| 亚洲熟妇AV乱码在线观看| 亚洲区小说区激情区图片区|