JPA(五)之实体关系多对多

1.背景介绍:学生和教师之间可以认为是多对多的关系

2.persistence.xml

3.实体bean

Student.java

package com.sinoi.bean;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

@Entity
public class Student {
	@Id @GeneratedValue
	private Integer id;
	@Column(length=10, nullable=false)
	private String name;
	@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	@JoinTable(name="student_teacher", inverseJoinColumns=@JoinColumn(name="tea_id"),
			 joinColumns=@JoinColumn(name="stu_id"))
	//inverseJoinColumn指向另外一个类对应表的id,而joinColumns指向就是所在这个类对应表的id
	private Set<Teacher> teachers = new HashSet<Teacher>();
	
	public Student(String name) {
		this.name = name;
	}
	
	public Student() {}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
	public void addTeacher(Teacher teacher) {
		this.teachers.add(teacher);
	}
	public void removeTeacher(Teacher teacher) {
		if (this.teachers.contains(teacher)) {
			this.teachers.remove(teacher);
		}
	}
	
}

 

Teacher.java

package com.sinoi.bean;

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

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

//被维护端
@Entity
public class Teacher {
	@Id @GeneratedValue
	private Integer id;
	@Column(length=10, nullable=false)
	private String name;
	@ManyToMany(mappedBy="teachers", fetch=FetchType.LAZY)
	private Set<Student> students = new HashSet<Student>();
	
	public Teacher(String name) {
		this.name = name;
	}
	
	public Teacher() {}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Student> getStudents() {
		return students;
	}

	public void setStudents(Set<Student> students) {
		this.students = students;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Teacher other = (Teacher) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	
}

 

4.测试

 

package junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.Test;

import com.sinoi.bean.Student;
import com.sinoi.bean.Teacher;


public class UnitTest {
	//保存数据
	@Test
	public void save() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("unitname");
		EntityManager manager = factory.createEntityManager();
		manager.getTransaction().begin();
		
		manager.persist(new Teacher("Mr li"));
		manager.persist(new Student("bean"));
		
		manager.getTransaction().commit();
		manager.close();
		factory.close();
	}
	
	//建立联系
	@Test
	public void buildST() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("unitname");
		EntityManager manager = factory.createEntityManager();
		manager.getTransaction().begin();
		
		//需要无参构造函数,否则会出现错误
		Teacher teacher = manager.getReference(Teacher.class, 1);
		Student student = manager.getReference(Student.class, 1);
		student.addTeacher(teacher);
		
		manager.getTransaction().commit();
		manager.close();
		factory.close();
	}
	
	//解除教师与学生关系
	@Test
	public void deleteTeacher() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("unitname");
		EntityManager manager = factory.createEntityManager();
		manager.getTransaction().begin();
		
		Teacher teacher = manager.getReference(Teacher.class, 1);
		Student student = manager.getReference(Student.class, 1);
		student.removeTeacher(teacher);
		
		manager.getTransaction().commit();
		manager.close();
		factory.close();
	}
	
	//删除学生   
	//注:如果要删除老师,得先将解除老师和学生之间的关系,然后再删除老师
	@Test
	public void deleteStudent() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("unitname");
		EntityManager manager = factory.createEntityManager();
		manager.getTransaction().begin();
		
		Student student = manager.getReference(Student.class, 1);
		manager.remove(student);
		
		manager.getTransaction().commit();
		manager.close();
		factory.close();
	}
}

你可能感兴趣的:(manytomany)