Per farlo funzionare in entrambi i modi è necessario disporre di due relazioni separate tra le entità. Questo può essere rappresentato da una tabella di join nel database ma per impostazione predefinita sarà rappresentato da due, quindi devi dire esplicitamente che vuoi una tabella di join.
Lo dimostrerò utilizzando il modello di Studente e Corso precedentemente menzionato.
@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;
...
}
Nell'esempio precedente abbiamo 2 rapporti con ogni lato della Student < -> rapporto Corso di essere proprietario di una relazione. Quindi questo risolve il problema di salvare le modifiche al database solo dal lato del proprietario poiché ogni lato è proprietario di una relazione.
Ma dobbiamo tenere a mente un fatto che, dopo il salvataggio dei dati, le collezioni di rapporto NON saranno ricaricati dal database così programmatore necessità di gestire collezioni di relazione da lui stesso.Dicendo questo voglio dire che il modo più semplice è quello di modificare setter per le collezioni di relazione per ricostruire il ciclo tra entità come questo:
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;
}
Grazie! Ottima spiegazione Quindi l'unico modo è aggiornare il proprietario? Entrambi i lati non possono essere proprietari? Come se mi piacerebbe che funzionasse in entrambi i modi? Non possibile? – pethel
Sì, è necessario aggiornare il lato proprietario. Solo un lato può essere il proprietario. Non c'è modo di farlo funzionare in entrambi i modi. –
@JBNizet e cosa dici della risposta qui sotto? – azerafati