Hibernate的多對多關係

一、表的關係:java

 分別有三個表:課程表、學生表、分數表。課程和學生的關係是多對多的,由於一個學生對應多個課程,而一個課程被多個學生選修。若是用一對多、多對一的觀點來看待課程和學生的關係顯然是不對的,由於課程表和學生表中都沒有外鍵。算法

所以,爲了找到表之間多對多的關係,須要引入第三個表(分數表),分數表中含有課程表和學生表的主鍵,能夠將兩個原本沒有關聯的表經過第三個錶鏈接起來。網絡

二、實體關係表達:session

 兩個實體中,分別建立了兩個set集合存儲對方實體對象。app

三、多對多的配置:dom

(1)student.hbm.xml:spa

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pers.zhb.domain">
    <class name="Student" table="student">
        <id name="studentno" column="studentno" >
            <generator class="native"></generator>
        </id>
        <property name="birthday" column="birthday"></property>
        <property name="classno" column="classno"></property>
        <property name="email" column="email"></property>
        <property name="phone" column="phone"></property>
        <property name="sex" column="sex"></property>
        <property name="sname" column="sname"></property>
        <property name="point" column="point"></property>
        <set name="courses" table="score" inverse="true"><!--一對多關係配置-->
            <key column="studentno"></key><!--指定了集合表的外鍵-->
            <many-to-many class="Course" column="courseid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

前面的內容大可能是對主鍵和普通屬性的配置,主要是對於一對多關係的配置:hibernate

 <set name="courses" table="score" inverse=「true」><!--一對多關係配置-->
            <key column="studentno"></key><!--指定了集合表的外鍵-->
            <many-to-many class="Course" column="courseid"></many-to-many>
 </set>

name屬性:對應的多的一方的集合名字。設計

table:聯繫student表和course表關係的第三個表。3d

column:student表的外鍵。

class:對應的多的一方(課程)的類名。

column:對應的多的一方的類的主鍵。

inverse:等於true至關於讓學生一方放棄維護關係,由於雙方同時維護關係會致使錯誤。

(2)course.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pers.zhb.domain">
    <class name="Course" table="course">
        <id name="courseid" column="courseid" >
            <generator class="native"></generator>
        </id>
        <property name="courseno" column="courseno"></property>
        <property name="cname" column="cname"></property>
        <property name="credit" column="credit"></property>
        <property name="type" column="type"></property>
        <property name="period" column="period"></property>
        <set name="students" table="score"><!--一對多關係配置-->
            <key column="courseid"></key><!--指定了集合表的外鍵-->
            <many-to-many class="Student" column="studentno"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

(3)雖然聯繫student表和course表須要第三個表score,可是並不須要對score表進行配置。  

四、多對多的基本操做:

(1)學生和課程的多對多添加:

public static void testadd() {
        Session session = HibernateUtils.openSession();//得到session
        Transaction transaction = session.beginTransaction();//開啓事務
        Student student=new Student();
        student.setSname("翟");
        student.setPoint(123f);
        student.setClassno(46);
        student.setSex("男");
        student.setBirthday("2019-11-11");
        student.setPhone("18739496522");
        student.setEmail("34288334@qq.com");

        Student student1=new Student();
        student1.setSname("翟hb");
        student1.setPoint(666f);
        student1.setClassno(46);
        student1.setSex("女");
        student1.setBirthday("2019-11-11");
        student1.setPhone("18739496522");
        student1.setEmail("34288334@qq.com");

        Course course=new Course();
        course.setCourseno("123");
        course.setCname("算法設計");
        course.setType("必修");
        course.setCredit(4);
        course.setPeriod(22);


        Course course1=new Course();
        course.setCourseno("456");
        course1.setCname("網絡");
        course1.setCredit(2);
        course1.setPeriod(12);
        course1.setType("必修");

        student.getCourses().add(course);
        student.getCourses().add(course1);
        student1.getCourses().add(course);
        student1.getCourses().add(course1);

        session.save(student);
        session.save(student1);
        session.save(course);
        session.save(course1);

        transaction.commit();//提交事務
        session.close();//關閉資源
    }

分別建立了兩個學生對象和兩個課程對象,在學生類的集合中添加兩個課程對象,一樣,在課程類的集合中添加兩個學生對象,並將他們轉換爲持久化狀態。

運行結果:

學生:

 

 

 課程:

 

 

 分數:

 

 

 (2)爲一個學生添加課程:

 public static void testadd1(){
        Session session = HibernateUtils.openSession();//得到session
        Transaction transaction = session.beginTransaction();//開啓事務
        Student student=session.get(Student.class,1);//得到要添加的學生對象

        Course course=new Course();//建立課程對象
        course.setCname("算法設計");
        course.setType("必修");
        course.setCredit(4);
        course.setPeriod(22);
        course.setCourseno("123");

        student.getCourses().add(course);

        session.save(course);//轉化爲持久態

        transaction.commit();//提交事務
        session.close();//關閉資源
    }

  運行結果:

學生:

 

 

 課程:

 

 

 分數:

 

 

 能夠看到學號爲1的學生增長了課程id爲1的課程。

(2)刪除操做:

public static void testDel(){
        Session session = HibernateUtils.openSession();//得到session
        Transaction transaction = session.beginTransaction();//開啓事務
        Student student=session.get(Student.class,1);//得到要添加的學生對象
        Course course=session.get(Course.class,1);
        Course course1=session.get(Course.class,2);

        student.getCourses().remove(course);
        student.getCourses().remove(course1);

        transaction.commit();//提交事務
        session.close();//關閉資源
    }

 五、級聯操做:

(1)級聯保存:

  public static void testadd1(){
        Session session = HibernateUtils.openSession();//得到session
        Transaction transaction = session.beginTransaction();//開啓事務
        Student student=session.get(Student.class,1);//得到要添加的學生對象

        Course course=new Course();//建立課程對象
        course.setCname("算法設計");
        course.setType("必修");
        course.setCredit(4);
        course.setPeriod(22);
        course.setCourseno("123");

        student.getCourses().add(course);

        transaction.commit();//提交事務
        session.close();//關閉資源
    }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pers.zhb.domain">
    <class name="Course" table="course">
        <id name="courseid" column="courseid" >
            <generator class="native"></generator>
        </id>
        <property name="courseno" column="courseno"></property>
        <property name="cname" column="cname"></property>
        <property name="credit" column="credit"></property>
        <property name="type" column="type"></property>
        <property name="period" column="period"></property>
        <set name="students" table="score" cascade="save-update"><!--一對多關係配置-->
            <key column="courseid"></key><!--指定了集合表的外鍵-->
            <many-to-many class="Student" column="studentno"></many-to-many>
        </set>
    </class>
</hibernate-mapping>  

 與一對多、多對一類似,級聯操做的運用能夠減小代碼量。

(2)級聯刪除:

可使用,可是危險係數較高。

相關文章
相關標籤/搜索