Hibernate多表關係配置——多對多對關係映射

多對多關係:第一個表中的一個行能夠與第二個表中的一個或多個行相關。第二個表中的一個行也能夠與第一個表中的一個或多個行相關。java

通常的設計中,多對多關聯映射,須要一箇中間表 Hibernate使用many-to-many標籤來表示多對多 多對多的關聯映射,在實體類中,跟一對多同樣,也是用集合來表示的數據庫

一、實體session

1.1 課程實體app

package demo.entity;

import java.util.HashSet;
import java.util.Set;

/**
 * 課程實體
 * @author Don
 * @date:日期:2017年4月11日 時間:下午2:25:45*
 * @version 1.0
 */
public class Course {
    private String id;
    private String name;
    //課程中包含的學生列表
    private Set<Student> stus = new HashSet<>();
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<Student> getStus() {
        return stus;
    }
    public void setStus(Set<Student> stus) {
        this.stus = stus;
    }
    
    public Course(){}
    
    public Course(String name) {
        this.setName(name);
    }
}
View Code

1.2 學生實體ide

package demo.entity;

import java.util.HashSet;
import java.util.Set;

/**
 * 學生實體
 * @author Don
 * @date:日期:2017年4月11日 時間:下午2:25:15*
 * @version 1.0
 */
public class Student {
    private String id;
    private String name;
    //學生選的課程列表
    private Set<Course> cous=new HashSet<>();
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<Course> getCous() {
        return cous;
    }
    public void setCous(Set<Course> cous) {
        this.cous = cous;
    }
    
    public Student() {
        
    }
    
    public Student(String name) {
        this.setName(name);
    }
}
View Code

二、關係映射配置測試

2.1 課程實體映射ui

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.Course" table="m2m_1_course">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- 生成主鍵-->
            <generator class="uuid"></generator>
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name" />
        
        <!-- 使用中間表的數據構建集合 -->
        <set name="stus" table="m2m_1_stu_cour" cascade="save-update">
            <!-- 中間表中記錄當前類的列 -->
            <key column="cid"></key>
            <many-to-many class="demo.entity.Student" column="stuid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

2.2 學生實體映射this

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 在這個一對一的關係中,Person能夠本身產生主鍵值 -->
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.Student" table="m2m_1_student">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator類來生成主鍵 -->
            <generator class="uuid" />
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name"  />
        
        <!-- 使用中間表的數據構建集合 -->
        <set name="cous" table="m2m_1_stu_cour" cascade="save-update">
            <!-- 中間表中記錄當前類的列 -->
            <key column="stuid"></key>
            <many-to-many class="demo.entity.Course" column="cid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

 

三、測試添加、刪除spa

 

package demo.test;

import org.hibernate.classic.Session;

import demo.entity.Course;
import demo.entity.Student;
import demo.util.HibernateUtil;

public class TestSave {

    public static void main(String[] args) {
        
        Student stu1 = new Student("張三");
        Student stu2 = new Student("李四");
        Student stu3 = new Student("王五");
        
        Course c1 = new Course("C#");
        Course c2 = new Course("JAVA");
        Course c3 = new Course("PHP");
        Course c4 = new Course("Object-C");
        
        //學生添加選課
        stu1.getCous().add(c1);
        stu1.getCous().add(c2);
        
        stu2.getCous().add(c2);
        stu2.getCous().add(c4);
        
        stu3.getCous().add(c1);
        stu3.getCous().add(c2);
        stu3.getCous().add(c3);
        stu3.getCous().add(c3);
        
        Session session =  HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        session.save(stu1);
        session.save(stu2);
        session.save(stu3);
        
        /*再次添加選課*/
        //學生記錄
        Student stu = (Student)session.get(Student.class, "2");
        //課程記錄
        Course course= (Course)session.get(Course.class, "1");
        stu.getCous().add(course);
        session.update(stu);
        
        /*刪除選課*/
        //學生記錄
        Student stuDelete = (Student)session.get(Student.class, "2");
        //課程記錄
        Course couDelete= (Course)session.get(Course.class, "1");
        stuDelete.getCous().remove(couDelete);
        session.update(stuDelete);
        
        //刪除學生記錄
        session.delete(stuDelete);
        
        session.getTransaction().commit();

    }

}
View Code
相關文章
相關標籤/搜索