es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;

}

Tags:  , ,

Answer

  1. Avatar for 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.

Comments are closed.