Hibernate的多对多映射关系

时间:2023-03-09 16:28:56
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即可

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

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