維護端註解java
@ManyToMany (cascade = CascadeType.REFRESH) @JoinTable (//關聯表 name = "student_teacher" , //關聯表名 inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被維護端外鍵 joinColumns = @JoinColumn (name = "student_id" ))//維護端外鍵
被維護端註解app
@ManyToMany( cascade = CascadeType.REFRESH, mappedBy = "teachers",//經過維護端的屬性關聯 fetch = FetchType.LAZY)
關係維護端刪除時,若是中間表存在些紀錄的關聯信息,則會刪除該關聯信息;ide
關係被維護端刪除時,若是中間表存在些紀錄的關聯信息,則會刪除失敗 .fetch
以學生和老師的對應關係爲例。一個學生能夠擁有多個老師,一個老師也能夠擁有多個學生。this
學生實體類spa
Student.java代碼code
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); } }
重點在於:blog
@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代碼rem
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; } }
重點在於:get
@ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) public Set getStudents() { return students; }
擁有mappedBy註解的實體類爲關係被維護端,另外的實體類爲關係維護端的。顧名思意,關係的維護端對關係(在多對多爲中間關聯表)的CRUD作操做。關係的被維護端沒有該操做,不能維護關係。