要使它工作在兩種方式中,您需要在您的實體之間有兩個單獨的關係。 這可以由數據庫中的一個連接表來表示,但默認情況下它將由兩個表示,所以你必須明確地說你想要一個連接表。
我會用之前提到的學生和課程模型來演示它。
@Entity
public class Student {
@ManyToMany
@JoinTable(name = "student_course",
joinColumns = {@JoinColumn(name = "courses_id")},
inverseJoinColumns = {@JoinColumn(name = "students_id")})
private Set<Course> courses;
...
}
@Entity
public class Course {
@ManyToMany
@JoinTable(name = "student_course",
joinColumns = {@JoinColumn(name = "students_id")},
inverseJoinColumns = {@JoinColumn(name = "courses_id")})
private Set<Student> students;
...
}
在上面的例子中,我們有與學生<的每一側2間的關係 - 一個關係>課程關係是所有者。 因此,這解決了僅在所有者一方保存對數據庫的更改的問題,因爲每一方都是一個關係的所有者。
但是我們必須記住一個事實,即在保存數據之後,關係集合將不會從數據庫 重新加載,因此程序員需要自己處理關係集合。說這個,我想說的是,最簡單的方法就是修改 的制定者收藏的關係,重建實體之間的週期是這樣的:
public void setCourses(Set<Course> courses) {
for(Course c : courses) {
if (!c.getStudents().contains(this)) {
c.getStudents().add(this);
}
}
this.courses = courses;
}
public void setStudents(Set<Student> students) {
for(Student s : students) {
if (!s.getCourses().contains(this)){
s.getCourses().add(this);
}
}
this.students = students;
}
謝謝!非常好的解釋。所以唯一的辦法是更新所有者?雙方都不能成爲所有者?如果我希望它能夠雙向工作?不可能? – pethel
是的,你必須更新所有者方。只有一方可以成爲所有者。沒有辦法使它同時工作。 –
@JBNizet,你對下面的答案有什麼看法? – azerafati