(九)Hibernate的多对多关联关系

一、概述

多对多关联关系在java对象中可以通过定义集合类型来实现关联关系。 在关系数据模型中,无法直接表达表和表之间的多对多关联关系,而是需要创建一个中间表包含了两边的主键,来表达两张表的多对多关联关系。

实例:我们用一个Student和Course(学生和课程)的例子来演示多对多关联关系。

(1)创建Student和Course类

   public class Student {
            private Integer id;
            private String name;
            //用一个集合包含该学生所选的课程对象
            private Set<Course> courses=new HashSet<Course>();
            public Integer getId() {
                return id;
            }
            public void setId(Integer id) {
                this.id = id;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public Set<Course> getCourses() {
                return courses;
            }
            public void setCourses(Set<Course> courses) {
                this.courses = courses;
            }

        }

  

public class Course {
                    private Integer id;
                    private String name;
                    //用一个集合包含所有选择该课程的学生
                    private Set<Student> students=new HashSet<Student>();
                    public Integer getId() {
                        return id;
                    }
                    public void setId(Integer id) {
                        this.id = id;
                    }
                    public String getName() {
                        return name;
                    }
                    public void setName(String name) {
                        this.name = name;
                    }
                    public Set<Student> getStudents() {
                        return students;
                    }
                    public void setStudents(Set<Student> students) {
                        this.students = students;
                    }

            }

  (2)编写我们的映射文件   

        <hibernate-mapping >
            <class name="com.cad.domain.Course" table="course">
                <id name="id" column="id">
                    <generator class="native"></generator>
                </id>
                <property name="name" column="name"></property>
                <!--table属性用来指定生成的中间表的表名称  inverse指定关联关系由Student维护-->
                <set name="students" table="student_course" inverse="true">
                    <key column="cid"></key>
                    <!--<many-to-many>元素中的column属性指定本表通过中间表中的sid外键关联到Student对象-->
                    <many-to-many class="com.cad.domain.Student" column="sid"></many-to-many>
                </set>
            </class>
         </hibernate-mapping>

  

            <hibernate-mapping >
                <class name="com.cad.domain.Student" table="student">
                    <id name="id" column="id">
                        <generator class="native"></generator>
                    </id>
                    <property name="name" column="name"></property>
                    <!-进行级联保存和更新操作-->
                    <set name="courses" table="student_course" cascade="save-update">
                        <key column="sid"></key>
                        <many-to-many class="com.cad.domain.Course" column="cid"></many-to-many>
                    </set>
                </class>
             </hibernate-mapping>

  测试:

            public class Demo {
                @Test
                public void fun(){
                    //读取配置文件
                    Configuration conf=new Configuration().configure();

                    //根据配置创建factory
                    SessionFactory sessionfactory=conf.buildSessionFactory();
                    Session session = sessionfactory.openSession();
                     Transaction ts=session.beginTransaction();
                    //创建两个Student
                    Student s1=new Student();
                    s1.setName("tom");
                    Student s2=new Student();
                    s2.setName("jack");

                    //创建三个Course
                    Course c1=new Course();
                    c1.setName("语文");
                    Course c2=new Course();
                    c2.setName("数学");
                    Course c3=new Course();
                    c3.setName("英语");

                    //因为设置了关联关系由Student维护,所以不需要课程再来关联Student
                    s1.getCourses().add(c1);
                    s1.getCourses().add(c2);
                    s1.getCourses().add(c3); 

                    s2.getCourses().add(c1);
                    s2.getCourses().add(c2);
                    s2.getCourses().add(c3);

                    //由于设置了级联保存,所以只保存Student即可
                    session.save(s1);
                    session.save(s2);

                    ts.commit();
                    session.close();
                    sessionfactory.close();
                }
            } 

    结果,数据库中生成了三张表。
    student和course
    还有中间表student_course
    里面的数据也相互对应。

  

原文地址:https://www.cnblogs.com/yuexiaoyun/p/9452393.html

时间: 2024-11-15 00:32:36

(九)Hibernate的多对多关联关系的相关文章

使用Hibernate映射多对多关联关系时,是否需要创建关联对象的总结

最近在做一个CMS管理项目,在RBAC模型创建时,遇到一个小疑问. 我们知道使用Hibernate可以使用many-to-many的注解或xml配置来自动完成多对多映射,例如:User Role Group三个对象,以User和Group为例. 在数据库表中必然存在一个t_user_group的table表,使用Hibernate完全可以在不建立UserGroup对象的情况就完成级联添加.删除.查询等操作. 目前来看,我们在实体模型中是没有必要创建UserGroup这个关联对象的. 但是如果遇到

Hibernate注解多对一关联关系

实体类1 package entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity publ

Hibernate5.2之多对多关联关系(六)

Hibernate5.2之多对多关联关系(六) 一.简介 Hibernate中多对多关联关系在工程中使用的频率也是非常高的,例如:大学中学生选课.用户订单等.在本博客中笔者一样通过实例代码为读者阐述Hibernate中的这种关联关系,笔者所采用的是学生选课的案例. 二.数据库的创建 create table courses ( id number(10,0) not null, cname varchar2(255 char), primary key (id) ); create table

《Hibernate学习笔记九》:多对一和一对多的关联关系

<Hibernate学习笔记九>:多对一和一对多的关联关系 前面介绍了一对一的关联关系在Hibernate应该如何来实现,这篇博文就来介绍下多对一和一对多的关联关系. 多对一和一对多的关联关系在我们的生活中也比较常见,例如,在我们学生时代,一个班级可以有多个学生,而一个学生只能属于一个班级,这就是一个多对一(一对多)的例子: 还有在我们的工作中,一个工作小组可以有多个用户,而一个用户只能属于一个小组,这也是一个多对一(一对多)的关系的例子. 1.多对一的单向关联关系 下面就以一个工作小组可以有

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个

Hibernate一对多(多对一)关联关系

上一篇博文总结了 Hibernate 的一对一的关联关系, 包括基于主键的单向一对一, 基于外键的单向一对一, 基于外键的双向一对一. 下面咱们说一下 Hibernate 的一对多关联关系. 其实一对多和多对一是一样的, 一对多反过来想就是多对一了. Hibernate的一对多可分为: 1. 单向一对多. 2. 双向一对多. OneByOne 一: 单向一对多 准备工作: 咱们以 客户(Customer) 和 订单(Order) 的例子来说, 一个客户可以有多个订单, 但是一个订单只能属于一个客

Hibernate关联关系映射之多对多关联关系

本次仍然使用一个示例的方式进行演示,学生与教师之间的关系就是一个典型的多对多关系,一个教师可以有多个学生,同样一个学生也可以有多个教师.在数据库中存储需要一张学生表存储学生信息,一个教师表存储教师信息,为了表示他们之间的关系我们需要一个中间表来表示他们之间的联系. 例如,在教师表中有id,name两个属性,学生表中同样有id,name两个属性.教师表中有两条记录分别是(1,董老师),(2,李老师):学生表中同样有两条(1,张三),(2,李四).在中间表中有两个字段(teacherId,stude

Hibernate映射多对多双向关联关系(小案例)

多对多双向关联关系(Project(工程)/Emp(员工)为案例): 步骤如下: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 private Integer pid; //名称 private String pname; //定义集合类型的Emp属性 private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; }

【SSH三大框架】Hibernate基础第八篇:多对多关联关系的操作

在Hibernate中的多对多关联关系,一般是不会使用的,因为对于数据库查询的时候时间复杂度太高. 我们在这里做的是学生和老师,一个学生可以有多个老师,一个老师可以有多个学生. 我们首先建立一个学生实体类:Student.java package cn.itcast.hibernate.domain; import java.util.Set; public class Student { private int id; private String name; private Set<Teac