目录
学习笔记,为了加强记忆和深入理解在此记录备忘。如有错误和理解不当之处,还望指正。万分感谢!
另外,实例和内容有些是参照网络其他博文,如有侵权可联系删掉。
学习重点:
多对多映射文件的配置
一、概述
一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多。多对多其实也分单向多对多和双向多对多,在日常使用比较多的是双向多对多。
以学生和老师进行实验。一个学生可以有多个老师教授,一个老师可以教多个学生。在关系表中学生编号和教师编号分别为俩个表的外键,他俩自身为联合主键。
在前面(一对多)已经介绍过单向和双向的区别,所以这里不再描述单向和双向,以下示例为多对多
二、多对多(双向)
2.1 老师实体类Teacher.java
package demo.entity;
import java.util.Set;
public class Teacher {
private int teaId;
private String teaName;
// 学生集合
private Set<Student> students;
public int getTeaId() {
return teaId;
}
public void setTeaId(int teaId) {
this.teaId = teaId;
}
public String getTeaName() {
return teaName;
}
public void setTeaName(String teaName) {
this.teaName = teaName;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
2.2 学生实体类Student.java
package demo.entity;
import java.util.Set;
public class Student {
private int stuId;
private String stuName;
private Set<Teacher> teachers;
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
2.3 老师映射文件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-7-31 10:45:48 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="demo.entity.Teacher" table="t_teacher">
<id name="teaId" type="int">
<column name="teaId" />
<generator class="native" />
</id>
<property name="teaName" type="java.lang.String">
<column name="teaName" />
</property>
<!-- 这里的table是指连接表的名称 -->
<set name="students" table="t_stu_tea" inverse="false" lazy="true">
<!-- 这个是关联表的字段名,同时是Teacher的外键 -->
<key column="teaId" />
<many-to-many class="demo.entity.Student" column="stuId"/>
</set>
</class>
</hibernate-mapping>
2.4 学生映射文件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-7-31 10:45:48 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="demo.entity.Student" table="t_student">
<id name="stuId" type="int">
<column name="stuId" />
<generator class="native" />
</id>
<property name="stuName" type="java.lang.String">
<column name="stuName" />
</property>
<!-- 这里的table是指连接表的名称 -->
<set name="teachers" table="t_stu_tea" inverse="false" lazy="true">
<!-- 这个是关联表的字段名,同时是Teacher的外键 -->
<key>
<column name="stuId" />
</key>
<many-to-many class="demo.entity.Teacher" column="teaId"/>
</set>
</class>
</hibernate-mapping>
2.5测试
package demo.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import demo.entity.Student;
import demo.entity.Teacher;
class JunitTest {
private Configuration configuration = new Configuration().configure();
private SessionFactory sFactory = configuration.buildSessionFactory();
private Session session = null;
private Transaction transaction = null;
@BeforeEach
void setUp() throws Exception {
session = sFactory.openSession();
transaction = session.beginTransaction();
}
@AfterEach
void tearDown() throws Exception {
transaction.commit();
session.close();
}
@Test
void testSave() {
Teacher teacher1 = new Teacher();
teacher1.setTeaName("老师1");
Teacher teacher2 = new Teacher();
teacher2.setTeaName("老师2");
Student student1 = new Student();
student1.setStuName("学生1");
Student student2 = new Student();
student2.setStuName("学生2");
Set<Teacher> teachers = new HashSet<>();
teachers.add(teacher1);
teachers.add(teacher2);
// 学生1有俩个老师
student1.setTeachers(teachers);
session.save(teacher1);
session.save(teacher2);
session.save(student1);
session.save(student2);
}
}