视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Hibernate关联关系映射之多对多关联关系
2020-11-09 14:44:53 责编:小采
文档


本次仍然使用一个示例的方式进行演示,学生与教师之间的关系就是一个典型的多对多关系,一个教师可以有多个学生,同样一个学生也可以有多个教师。在数据库中存储需要一张学生表存储学生信息,一个教师表存储教师信息,为了表示他们之间的关系我们需要一个中间

本次仍然使用一个示例的方式进行演示,学生与教师之间的关系就是一个典型的多对多关系,一个教师可以有多个学生,同样一个学生也可以有多个教师。在数据库中存储需要一张学生表存储学生信息,一个教师表存储教师信息,为了表示他们之间的关系我们需要一个中间表来表示他们之间的联系。

例如,在教师表中有id,name两个属性,学生表中同样有id,name两个属性。教师表中有两条记录分别是(1,董老师),(2,);学生表中同样有两条(1,张三),(2,李四)。在中间表中有两个字段(teacherId,studentId),这两个字段构成一个联合主键,同时这两个字段又是教师表和学生表的外键,老师和学生进行关联的时候直接插入关联的老师和学生的id在中间表内即可,例如在中间表中插入(1,1)表示董老师与张三进行关联,插入(1,2)表示董老师与李四关联。

下面我们看一下Teacher类和Student类

package entity;

import java.util.HashSet;
import java.util.Set;

public class Teacher {
	private Long id;
	private String name;
	private Set students = new HashSet();
	public Long getId() {
	return id;
	}
	public void setId(Long id) {
	this.id = id;
	}
	public String getName() {
	return name;
	}
	public void setName(String name) {
	this.name = name;
	}
	public Set getStudents() {
	return students;
	}
	public void setStudents(Set students) {
	this.students = students;
	}
}
package entity;

import java.util.HashSet;
import java.util.Set;

public class Student {
	private Long id;
	private String name;	
	private Set teachers = new HashSet();
	
	public Long getId() {
	return id;
	}
	public void setId(Long id) {
	this.id = id;
	}
	public String getName() {
	return name;
	}
	public void setName(String name) {
	this.name = name;
	}
	public Set getTeachers() {
	return teachers;
	}
	public void setTeachers(Set teachers) {
	this.teachers = teachers;
	}	
}

在POJO类中仍然使用集合表示有多条记录。

下面在看一个他们的映射配置文件

首先看Teacher.hbm.xml




 
 
 
 
 
 
 
 
 
 
 
 
 
 

类中的Set类型的属性在映射配置文件中仍然使用标签进行映射,在标签中使用表示他们之间的关系是多对多。

然后看Student.hbm.xml





 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

这样,教师和学生之间的多对多关联映射就配置完了,下面看一下测试类。这里使用JUtil进行测试

package test;

import static org.junit.Assert.*;

import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Student;
import entity.Teacher;
import factory.HibernateSessionFactory;

public class Test {

	private Session session = null;
	private Transaction tran = null;

	// 存储对象
	@org.junit.Test
	public void save() {
	session = HibernateSessionFactory.getSession();
	tran = session.beginTransaction();
	try {
	Teacher teacher = new Teacher();
	teacher.setId(1L);
	teacher.setName("董老师");

	Teacher t2 = new Teacher();
	t2.setId(2l);
	t2.setName("");

	Student s1 = new Student();
	s1.setId(1L);
	s1.setName("李四");

	Student s2 = new Student();
	s2.setId(2l);
	s2.setName("张三");

	teacher.getStudents().add(s1);
	teacher.getStudents().add(s2);
	t2.getStudents().add(s1);
	t2.getStudents().add(s2);
	s1.getTeachers().add(teacher);
	s1.getTeachers().add(t2);
	s2.getTeachers().add(teacher);
	s2.getTeachers().add(t2);

	session.save(teacher);
	session.save(t2);
	session.save(s1);
	session.save(s2);

	tran.commit();
	} catch (Exception e) {
	tran.rollback();
	}
	}

	// 获取老师信息
	@org.junit.Test
	public void GetTeacher() {
	session = HibernateSessionFactory.getSession();
	tran = session.beginTransaction();
	try {
	Teacher teacher = (Teacher) session.get(Teacher.class, 1l);
	Set set = teacher.getStudents();
	System.out.println(teacher.getName() + "的学生是:");
	Iterator it = set.iterator();
	while (it.hasNext()) {
	Student s = it.next();
	System.out.println(s.getName());
	}
	tran.commit();
	} catch (Exception e) {
	tran.rollback();
	}
	}

	// 解除关联关系
	@org.junit.Test
	public void RemoveRelation() {
	session = HibernateSessionFactory.getSession();
	tran = session.beginTransaction();
	try {
	Student s = (Student) session.get(Student.class, 1l);
	Teacher teacher = (Teacher) session.get(Teacher.class, 1l);
	// 如果Teacher的inverse属性为false可以解除,如果为true不可以解除
	teacher.getStudents().remove(s);
	tran.commit();
	} catch (Exception e) {
	tran.rollback();
	}
	}

	// 删除关联关系
	@org.junit.Test
	public void DeleteRelation() {
	session = HibernateSessionFactory.getSession();
	tran = session.beginTransaction();
	try {
	Teacher teacher = (Teacher) session.get(Teacher.class, 2l);
	// 当teacher的inverse属性为false时,可以将教师信息删除,并且将中间表中相关记录删除
	// 当inverse属性为true时将教师信息删除时抛出异常
	session.delete(teacher);
	tran.commit();
	} catch (Exception e) {
	tran.rollback();
	}
	}
}


下载本文
显示全文
专题