Para que funcione en ambos sentidos, necesita tener dos relaciones separadas entre sus entidades. Esto se puede representar mediante una tabla de unión en la base de datos pero, de forma predeterminada, estará representada por dos, por lo que debe decir explícitamente que desea una tabla de unión.
Lo demostraré utilizando el modelo de Estudiante y Curso mencionado anteriormente.
@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;
...
}
En el ejemplo anterior tenemos 2 relaciones con cada lado del Estudiante < -> relación Curso de ser dueño de una relación. Esto resuelve el problema de guardar los cambios en la base de datos solo en el lado del propietario, ya que cada lado es dueño de una relación.
Pero tenemos que tener en cuenta que después de guardar los datos, las colecciones de relaciones NO se volverán a cargar desde la base de datos , por lo que el programador debe manejar las colecciones de relaciones por sí mismo.Al decir esto quiero decir que la forma más fácil es modificar los emisores para las colecciones de relación para reconstruir ciclo entre las entidades de la siguiente manera:
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;
}
Gracias! Muy buena explicación. Entonces, ¿la única forma es actualizar al propietario? Ambas partes no pueden ser dueños ¿verdad? ¿Cómo me gustaría que funcione en ambos sentidos? ¿Imposible? – pethel
Sí, debe actualizar el lado del propietario. Solo un lado puede ser el dueño. No hay forma de hacerlo funcionar en ambos sentidos. –
@JBNizet, y ¿qué dices sobre la respuesta a continuación? – azerafati