Hibernate的多对多关联关系

Posted 跃小云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
    里面的数据也相互对应。

  

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

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

Hibernate:n-n关联关系

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联

hibernate 的 关联关系之多对多 和 延迟加载

Hibernate的多对多关系

hibernate关联关系(多对多)