这篇文章讲的是hibernate中多对多关系映射和相关操作,如有错误或不当之处,还望各位大神批评指正。
多对多关系映射配置
目标
假设一个学生对应于多个老师,而且一个老师对应多个学生,完成相关操作
相关类
1.Teacher类
public class Teacher {
private Integer id ;
private String name ;
private Set<Student>students = new HashSet<>() ;
//省略get和set方法
}
2.Studet类
public class Student {
private Integer id ;
private String name ;
private float score ;
private Set<Teacher>teachers = new HashSet<>() ;
}
*.hbm.xml
1.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">
<!-- Generated 2018-6-21 11:56:44 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.cn.cmc.model.Teacher" table="TEACHER">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="sequence" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<!--
table:指定中间表的位置
key:配置本表该列在中间表外键的名称
many-to-many:配置多对多的映射关系
column:配置关联类在中间表的外键名
class:外键对应的类名
-->
<set name="students" table="STD_TEACHER">
<key>
<column name="T_ID" />
</key>
<many-to-many column="S_ID" class="com.cn.cmc.model.Student" />
</set>
</class>
</hibernate-mapping>
2.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">
<!-- Generated 2018-6-21 11:56:44 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.cn.cmc.model.Student" table="STUDENT">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="sequence" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="score" type="float">
<column name="SCORE" />
</property>
<!--
table:指定中间表的位置
key:配置本表该列在中间表外键的名称
many-to-many:配置多对多的映射关系
column:配置关联类在中间表的外键名
class:外键对应的类名
-->
<set name="teachers" table="STD_TEACHER" >
<key>
<column name="S_ID" />
</key>
<many-to-many column="T_ID" class="com.cn.cmc.model.Teacher" />
</set>
</class>
</hibernate-mapping>
相关操作
添加操作
Teacher t1 = new Teacher() ;
t1.setName("Mike");
Teacher t2 = new Teacher() ;
t2.setName("John");
Student s1 = new Student() ;
s1.setName("cmc");
s1.setScore(100);
Student s2 = new Student() ;
s2.setName("syl");
s2.setScore(95);
Student s3 = new Student() ;
s3.setName("cjx");
s3.setScore(98);
Student s4 = new Student() ;
s4.setName("cmy");
s4.setScore(90);
t1.getStudents().add(s1) ;
t1.getStudents().add(s2) ;
t2.getStudents().add(s3) ;
t2.getStudents().add(s4) ;
session.save(s1) ;
session.save(s2) ;
session.save(s3) ;
session.save(s4) ;
session.save(t1) ;
session.save(t2) ;
查找操作
Teacher t = (Teacher) session.get(Teacher.class, 123) ;
System.out.println(t.getName());
Iterator<Student> stds = t.getStudents().iterator() ;
while(stds.hasNext()){
Student std = stds.next() ;
System.out.println(std.getName());
}
更新操作
Teacher t = (Teacher) session.get(Teacher.class, 123) ;
t.setName("叶清逸");
session.update(t);
删除操作
Teacher t = (Teacher) session.get(Teacher.class, 123) ;
session.delete(t);