JPA--多对多关系

时间:2023-03-08 19:59:41

JPA中,多对多关系用@ManyToMany标示。

关系维护端:

 package com.yl.demo1.bean.manyTomany;

 import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany; @Entity
public class Student {
private Integer id;
private String name;
private Set<Teacher> teachers = new HashSet<Teacher>(); public Student(){} public Student(String name) {
super();
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* Student是关系的维护端
* inverseJoinColumns和joinColumns是定义关联表中的字段,其中inverseJoinColumns定义关系被维护端的字段
* joinColumns定义关系维护端的字段
*/
@ManyToMany(cascade=CascadeType.REFRESH)
@JoinTable(name="student_teacher", inverseJoinColumns=@JoinColumn(name="teacher_id"),
joinColumns=@JoinColumn(name="student_id"))
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);
}
}
}

关系被维护端:

 package com.yl.demo1.bean.manyTomany;

 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.ManyToMany; @Entity
public class Teacher {
private Integer id;
private String name;
private Set<Student> students = new HashSet<Student>(); public Teacher(){} public Teacher(String name) {
super();
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//teacher为关系的被维护端
@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="teachers", fetch=FetchType.LAZY)
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;
} }

常见操作:

 @Test
public void save() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = new Student("yyyy");
em.persist(student); Teacher teacher = new Teacher("jiawenhui");
em.persist(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 建立学生与老师之间的关系
*/
@Test
public void buildConnection() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.find(Student.class, 1); Teacher teacher = em.getReference(Teacher.class, 1); student.addTeacher(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 解除学生与老师之间的关系
*/
@Test
public void deleteConnection() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.find(Student.class, 1); Teacher teacher = em.getReference(Teacher.class, 1); student.removeTeacher(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 删除老师(删除关系被维护端)
*/
@Test
public void deleteTeacher() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.find(Student.class, 1);
Teacher teacher = em.getReference(Teacher.class, 1);
//先解除Student和Teacher之间的关系
student.removeTeacher(teacher);
//在删除Teacher
em.remove(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 删除学生(删除关系维护端)
*/
@Test
public void deleteStudent() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.getReference(Student.class, 1);
em.remove(student); em.getTransaction().commit();
em.close();
factory.close();
}