No puedo eliminar la asociación en Many To Many bidireccional de Hibernate.
No puedo eliminar la asociación en la tabla courses_student de curso y estudiante al intentar borrar un curso, incluso si quiero eliminarlo en cascada, no me funciona ya que hay una clave foránea en courses_student, no sé cuál es el problema.
También he intentado quitar la asociación en la tabla courses_student haciendo una actualización, pero no ha pasado nada.
DAO
@Override
public boolean deleteCourse(int id) {
Session currentSession = entityManager.unwrap(Session.class);
Courses course = currentSession.load(Courses.class, id);
for(Student student : course.getEstudiantes()) {
course.removeStudent(student);
}
currentSession.delete(course);
if(course.getId() == null)
return true;
else
return false;
}
Courses entity
@Entity
@Table(name = “courses”)
public class Courses {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column
private String nombre;
@Column
private String descripcion;
@ManyToMany(mappedBy = "courses")
private Set<student> Estudiantes = new HashSet<student>();
public Courses() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public Set<student> getEstudiantes() {
return Estudiantes;
}
public void setEstudiantes(Set<student> estudiantes) {
Estudiantes = estudiantes;
}
public void removeStudent(Student student) {
this.Estudiantes.remove(student);
student.getCourses().remove(this);
}
}
Student entity
@Entity
@Table(name = “students”)
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column
private String nombre;
@Column
private String apellido;
@Column
private String dni;
@ManyToMany(fetch=FetchType.LAZY,
cascade= {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
@JoinTable(
name="courses_students",
joinColumns=@JoinColumn(name="id_student"),
inverseJoinColumns=@JoinColumn(name="id_course")
)
private Set<courses> courses = new HashSet<courses>();
public Student() {
}
public Student(String nombre, String apellido, String dni) {
this.nombre = nombre;
this.apellido = apellido;
this.dni = dni;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public String getDni() {
return dni;
}
public void setDni(String dni) {
this.dni = dni;
}
public Set<courses> getCourses() {
return courses;
}
public void setCourses(Set<courses> courses) {
this.courses = courses;
}
}
EDIT:
Al parecer, funciona para mí, intentando actualizar desde el lado del propietario.
@Override
public boolean deleteCourse(int id) {
Session currentSession = entityManager.unwrap(Session.class);
Courses course = currentSession.load(Courses.class, id);
for(Student student : course.getEstudiantes()) {
student.removeCourse(course);
}
currentSession.update(course);
if(course.getId() == null)
return true;
else
return false;
}
davy.ai
Entidad de Estudiante
public void removeCourse(Cursos curso)
this.cursos.remove(curso);
curso.getEstudiantes().remove(this);
Ahora parece que funciona, no sé por qué no funcionaba antes.