JPA中,多对多关系用@ManyToMany标示。
关系维护端:
1 package com.yl.demo1.bean.manyTomany; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.CascadeType; 7 import javax.persistence.Column; 8 import javax.persistence.Entity; 9 import javax.persistence.GeneratedValue; 10 import javax.persistence.Id; 11 import javax.persistence.JoinColumn; 12 import javax.persistence.JoinTable; 13 import javax.persistence.ManyToMany; 14 15 @Entity 16 public class Student { 17 private Integer id; 18 private String name; 19 private Set<Teacher> teachers = new HashSet<Teacher>(); 20 21 22 public Student(){} 23 24 public Student(String name) { 25 super(); 26 this.name = name; 27 } 28 @Id @GeneratedValue 29 public Integer getId() { 30 return id; 31 } 32 public void setId(Integer id) { 33 this.id = id; 34 } 35 @Column(length=10, nullable=false) 36 public String getName() { 37 return name; 38 } 39 public void setName(String name) { 40 this.name = name; 41 } 42 /** 43 * Student是关系的维护端 44 * inverseJoinColumns和joinColumns是定义关联表中的字段,其中inverseJoinColumns定义关系被维护端的字段 45 * joinColumns定义关系维护端的字段 46 */ 47 @ManyToMany(cascade=CascadeType.REFRESH) 48 @JoinTable(name="student_teacher", inverseJoinColumns=@JoinColumn(name="teacher_id"), 49 joinColumns=@JoinColumn(name="student_id")) 50 public Set<Teacher> getTeachers() { 51 return teachers; 52 } 53 public void setTeachers(Set<Teacher> teachers) { 54 this.teachers = teachers; 55 } 56 57 public void addTeacher(Teacher teacher) { 58 this.teachers.add(teacher); 59 } 60 61 public void removeTeacher(Teacher teacher) { 62 if (this.teachers.contains(teacher)) { 63 this.teachers.remove(teacher); 64 } 65 } 66 }
关系被维护端:
1 package com.yl.demo1.bean.manyTomany; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.CascadeType; 7 import javax.persistence.Column; 8 import javax.persistence.Entity; 9 import javax.persistence.FetchType; 10 import javax.persistence.GeneratedValue; 11 import javax.persistence.Id; 12 import javax.persistence.ManyToMany; 13 14 @Entity 15 public class Teacher { 16 private Integer id; 17 private String name; 18 private Set<Student> students = new HashSet<Student>(); 19 20 public Teacher(){} 21 22 public Teacher(String name) { 23 super(); 24 this.name = name; 25 } 26 @Id @GeneratedValue 27 public Integer getId() { 28 return id; 29 } 30 public void setId(Integer id) { 31 this.id = id; 32 } 33 @Column(length=10, nullable=false) 34 public String getName() { 35 return name; 36 } 37 public void setName(String name) { 38 this.name = name; 39 } 40 //teacher为关系的被维护端 41 @ManyToMany(cascade=CascadeType.REFRESH, mappedBy="teachers", fetch=FetchType.LAZY) 42 public Set<Student> getStudents() { 43 return students; 44 } 45 public void setStudents(Set<Student> students) { 46 this.students = students; 47 } 48 49 @Override 50 public int hashCode() { 51 final int prime = 31; 52 int result = 1; 53 result = prime * result + ((id == null) ? 0 : id.hashCode()); 54 return result; 55 } 56 57 @Override 58 public boolean equals(Object obj) { 59 if (this == obj) 60 return true; 61 if (obj == null) 62 return false; 63 if (getClass() != obj.getClass()) 64 return false; 65 Teacher other = (Teacher) obj; 66 if (id == null) { 67 if (other.id != null) 68 return false; 69 } else if (!id.equals(other.id)) 70 return false; 71 return true; 72 } 73 74 75 76 77 }
常见操作:
1 @Test 2 public void save() { 3 EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL"); 4 EntityManager em = factory.createEntityManager(); 5 em.getTransaction().begin();//事务开始 6 7 Student student = new Student("yyyy"); 8 em.persist(student); 9 10 Teacher teacher = new Teacher("jiawenhui"); 11 em.persist(teacher); 12 13 em.getTransaction().commit(); 14 em.close(); 15 factory.close(); 16 } 17 18 /** 19 * 建立学生与老师之间的关系 20 */ 21 @Test 22 public void buildConnection() { 23 EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL"); 24 EntityManager em = factory.createEntityManager(); 25 em.getTransaction().begin();//事务开始 26 27 Student student = em.find(Student.class, 1); 28 29 Teacher teacher = em.getReference(Teacher.class, 1); 30 31 student.addTeacher(teacher); 32 33 em.getTransaction().commit(); 34 em.close(); 35 factory.close(); 36 } 37 38 /** 39 * 解除学生与老师之间的关系 40 */ 41 @Test 42 public void deleteConnection() { 43 EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL"); 44 EntityManager em = factory.createEntityManager(); 45 em.getTransaction().begin();//事务开始 46 47 Student student = em.find(Student.class, 1); 48 49 Teacher teacher = em.getReference(Teacher.class, 1); 50 51 student.removeTeacher(teacher); 52 53 em.getTransaction().commit(); 54 em.close(); 55 factory.close(); 56 } 57 58 /** 59 * 删除老师(删除关系被维护端) 60 */ 61 @Test 62 public void deleteTeacher() { 63 EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL"); 64 EntityManager em = factory.createEntityManager(); 65 em.getTransaction().begin();//事务开始 66 67 Student student = em.find(Student.class, 1); 68 Teacher teacher = em.getReference(Teacher.class, 1); 69 //先解除Student和Teacher之间的关系 70 student.removeTeacher(teacher); 71 //在删除Teacher 72 em.remove(teacher); 73 74 em.getTransaction().commit(); 75 em.close(); 76 factory.close(); 77 } 78 79 /** 80 * 删除学生(删除关系维护端) 81 */ 82 @Test 83 public void deleteStudent() { 84 EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL"); 85 EntityManager em = factory.createEntityManager(); 86 em.getTransaction().begin();//事务开始 87 88 Student student = em.getReference(Student.class, 1); 89 em.remove(student); 90 91 em.getTransaction().commit(); 92 em.close(); 93 factory.close(); 94 } 95