首页 > 代码库 > Hibernate的多对多映射关系

Hibernate的多对多映射关系

example:
    老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢??

在Hibernate中多对多关系分为两种:1单向的多对多,2双向的多对多

下面详细说明一些两种有什么不同和实现步骤

  I单向的多对多实现步骤:

  1新建teacher、student表,可以任意选择在其中一个表添加另一个表的集合,(例如在teacher中添加student的set<Student>集合,例如private set<student> students)

  代码如下:

  teacher:

package com.atguigu.hibernate.n2n;import java.util.Set;public class Teacher {    private Integer ID;    private String  Name;    private Set<Student> students;    public Integer getID() {        return ID;    }    public void setID(Integer iD) {        ID = iD;    }    public String getTea_Name() {        return Name;    }    public void setTea_Name(String Name) {        this.Name =Name;    }    public Set<Student> getStudents() {        return students;    }    public void setStudents(Set<Student> students) {        this.students = students;    }    }

Student:
  

package com.atguigu.hibernate.n2n;public class Student {    private Integer S_ID;    private String  s_Name;    public Integer getS_ID() {        return S_ID;    }    public void setS_ID(Integer s_ID) {        S_ID = s_ID;    }    public String getS_Name() {        return s_Name;    }    public void setS_Name(String s_Name) {        this.s_Name = s_Name;    }    }

2在有set集合属性的持久化类的.hbm.xml文件里添加集合信息和many-to-many信息,另外一个表的.hbm.xml文件跟平常一样即可

teacher:

  

<?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>    <class name="com.atguigu.hibernate.n2n.Teacher" table="TEACHER">              <id name="ID" type="java.lang.Integer">            <column name="ID" />            <generator class="native" />        </id>                <property name="Name" type="java.lang.String" access="field">            <column name="NAME" />        </property>          <!--                 name:set集合的名字                Table:中间表的名字                key--column:中间表的外键列的名字,这个类的值就是属于<class name="">这个类的ID值                many-to-many的column:也是指定中间表的外键列的名字,这列的值就属于many-to-many的class类的ID值         -->        <!---注释部分可能会引起XML格式错误,--->        <set name="students" table="t_s_Connection">            <key>                <column name="T_ID" />            </key>            <many-to-many class="com.atguigu.hibernate.n2n.Student"  column="S_ID"/>        </set>            </class></hibernate-mapping>    

student:

  

<?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>    <class name="com.atguigu.hibernate.n2n.Student" table="STUDENT">              <id name="S_ID" type="java.lang.Integer">            <column name="S_ID" />            <generator class="native" />        </id>               <property name="s_Name" type="java.lang.String">            <column name="S_NAME" />       </property>           </class></hibernate-mapping>

然后配置一下Hibernate.cfg.xml文件即可

单向的多对多关系,就是这样了,但是其的增删改查又有什么特点???这个稍后再探究

 

 

II双向的多对多关系如何配置
1在双方持久化类(就是teacher和student)中互相添加对方的对象集合,并且当中有一个需要实例化

例如:在teacher中添加private set<student>

    在student中添加private set<teacher>=new hashSet<teacher>();

代码:teacher:

package com.atguigu.hibernate.n2n;import java.util.Set;public class Teacher {    private Integer ID;    private String  Name;    private Set<Student> students;    public Integer getID() {        return ID;    }    public void setID(Integer iD) {        ID = iD;    }    public String getTea_Name() {        return Name;    }    public void setTea_Name(String Name) {        this.Name =Name;    }    public Set<Student> getStudents() {        return students;    }    public void setStudents(Set<Student> students) {        this.students = students;    }    }

student:

package com.atguigu.hibernate.n2n;import java.util.HashSet;import java.util.Set;public class Student {    private Integer S_ID;    private String  s_Name;    private Set<Teacher> teachers=new HashSet<Teacher>();        public Set<Teacher> getTeachers() {        return teachers;    }    public void setTeachers(Set<Teacher> teachers) {        this.teachers = teachers;    }    public Integer getS_ID() {        return S_ID;    }    public void setS_ID(Integer s_ID) {        S_ID = s_ID;    }    public String getS_Name() {        return s_Name;    }    public void setS_Name(String s_Name) {        this.s_Name = s_Name;    }    }

2在双方的持久化类中添加set和many-to-many设置

teacher.hbm.xml:

<?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>    <class name="com.atguigu.hibernate.n2n.Teacher" table="TEACHER">              <id name="ID" type="java.lang.Integer">            <column name="ID" />            <generator class="native" />        </id>                <property name="Name" type="java.lang.String" access="field">            <column name="NAME" />        </property>          <!--                 name:set集合的名字                Table:中间表的名字                key--column:中间表的外键列的名字(可以放任意名字),就是指明中间表的外键列是当前持久化类的的ID属性             many-to-many的column:也是指定中间表的外键列的名字,这列的值就属于many-to-many的class类的ID值         -->        <set name="students" table="t_s_Connection">            <key>                <column name="T_ID" />            </key>            <many-to-many class="com.atguigu.hibernate.n2n.Student"  column="S_ID"/>        </set>            </class></hibernate-mapping>

student.hbm.xml:

<?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>    <class name="com.atguigu.hibernate.n2n.Student" table="STUDENT">              <id name="S_ID" type="java.lang.Integer">            <column name="S_ID" />            <generator class="native" />        </id>               <property name="s_Name" type="java.lang.String">            <column name="S_NAME" />       </property>       <set name="teachers" table="t_s_Connection">               <key>                   <column name="S_ID"></column>                                  </key>               <many-to-many class="com.atguigu.hibernate.n2n.Teacher" column="T_ID"></many-to-many>       </set>    </class></hibernate-mapping>

然后在Hibernate.cfg.xml文件配置一下mapping-resource即可

 

 

但是双向的多对多关系的增删改查又是怎样的呢??

 

 

而且单向的多对多关系和多向的多对多关系两者有什么不同,有什么有缺点??

 

Hibernate的多对多映射关系