Hibernate多表关系配置——多对多对关系映射

Posted zxd543

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate多表关系配置——多对多对关系映射相关的知识,希望对你有一定的参考价值。

多对多关系:第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的

1、实体

1.1 课程实体

技术分享
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 学生实体

技术分享
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、关系映射配置

2.1 课程实体映射

<?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 学生实体映射

<?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>

 

3、测试添加、删除

 

技术分享
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

 

以上是关于Hibernate多表关系配置——多对多对关系映射的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 多对多关系映射

hibernate关联关系(多对多)

hibernate多对多双向关系映射的级联配置

Hibernate3 多对多关系

Hibernate多表关系配置——多对一关系映射

hibernate 双向多对多映射关系