欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Hibernate关联关系映射之多对多关联关系

程序员文章站 2022-04-11 16:03:15
...

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

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

例如,在教师表中有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();
		}
	}
}