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