Um es auf beide Arten funktionieren zu lassen, müssen Sie zwei getrennte Beziehungen zwischen Ihren Entitäten haben. Dies kann durch eine Join-Tabelle in der Datenbank dargestellt werden, aber standardmäßig wird es durch zwei dargestellt, so dass Sie explizit sagen müssen, dass Sie eine Join-Tabelle wollen.
Ich werde es mit dem zuvor erwähnten Modell von Student und Kurs demonstrieren.
@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;
...
}
Im obigen Beispiel haben wir 2 Beziehungen mit jeder Seite des Studenten < -> Kurs Beziehung zu dem Eigentümer einer Beziehung. So löst das Problem des Speicherns von Änderungen in der Datenbank nur auf der Seite des Besitzers, da jede Seite Besitzer einer Beziehung ist.
Aber wir dürfen nicht vergessen, eine Tatsache zu halten, dass die Daten nach dem Speichern, Beziehung Sammlungen werden nicht aus der Datenbank so Programmierern Notwendigkeit Beziehung neu geladen werden Sammlungen von sich selbst zu behandeln.Indem man sagt, dies möchte ich sagen, dass der einfachste Weg, um ist zu modifizieren Setter für Beziehung Sammlungen Zyklus zwischen Entitäten wie folgt neu zu erstellen:
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;
}
Thank you! Sehr gute Erklärung. Also ist der einzige Weg, den Besitzer zu aktualisieren? Beide Seiten können Eigentümer nicht sein, oder? Wie wenn ich möchte, dass es in beide Richtungen funktioniert? Nicht möglich? – pethel
Ja, Sie müssen die Eigentümerseite aktualisieren. Nur eine Seite kann der Eigentümer sein. Es gibt keine Möglichkeit, es in beide Richtungen funktionieren zu lassen. –
@ JBNizet, und was sagst du über die folgende Antwort? – azerafati