維護端注解
@ManyToMany (cascade = CascadeType.REFRESH) @JoinTable (//關聯表 name = "student_teacher" , //關聯表名 inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被維護端外鍵 joinColumns = @JoinColumn (name = "student_id" ))//維護端外鍵
被維護端注解
@ManyToMany( cascade = CascadeType.REFRESH, mappedBy = "teachers",//通過維護端的屬性關聯 fetch = FetchType.LAZY)
關系維護端刪除時,如果中間表存在些紀錄的關聯信息,則會刪除該關聯信息;
關系被維護端刪除時,如果中間表存在些紀錄的關聯信息,則會刪除失敗 .
以學生和老師的對應關系為例。一個學生可以擁有多個老師,一個老師也可以擁有多個學生。
學生實體類
Student.java代碼
package com.taoistwar.jpa.entity.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.GenerationType; 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 teachers = new HashSet(); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(nullable = false, length = 16) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(cascade = CascadeType.REFRESH) @JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) public Set getTeachers() { return teachers; } public void setTeachers(Set teachers) { this.teachers = teachers; } public void addTeacher(Teacher teacher) { this.teachers.add(teacher); } public void removeTeachers(Teacher teacher) { this.teachers.remove(teacher); } }
重點在於:
@ManyToMany(cascade = CascadeType.REFRESH) @JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) public Set getTeachers() { return teachers; }
Teacher.java代碼
package com.taoistwar.jpa.entity.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.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; @Entity public class Teacher { private Integer id; private String name; private Set students = new HashSet(); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(nullable = false, length = 16) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) public Set getStudents() { return students; } public void setStudents(Set 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; } }
重點在於:
@ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) public Set getStudents() { return students; }
擁有mappedBy注解的實體類為關系被維護端,另外的實體類為關系維護端的。顧名思意,關系的維護端對關系(在多對多為中間關聯表)的CRUD做操作。關系的被維護端沒有該操作,不能維護關系。