Home > Back-end >  iterator error problem in Hibernate java.util.ConcurrentModificationException: null
iterator error problem in Hibernate java.util.ConcurrentModificationException: null

Time:11-28

I am trying to delete all the elements that are in course_students but I get an exception, it only lets me delete the first one.How could I delete all the elements from the association, even try using iterators.if there is any example it would help me a lot.

here is my code, it works fine except when i try to delete more asocciations

@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;

}

Class courses

@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);
    }
    

}

exception

java.util.ConcurrentModificationException: null
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445) ~[na:1.8.0_281]
    at java.util.HashMap$KeyIterator.next(HashMap.java:1469) ~[na:1.8.0_281]
    at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:887) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at learnwithus.dao.CoursesDAOImpl.deleteCourse(CoursesDAOImpl.java:40) ~[classes/:na]
    at learnwithus.dao.CoursesDAOImpl$$FastClassBySpringCGLIB$$bc75a7c.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.12.jar:5.3.12]

CodePudding user response:

i've solved it, i hope it helps

@Override
    public boolean deleteCourse(int id) {
        Session currentSession = entityManager.unwrap(Session.class);
        Courses course = currentSession.load(Courses.class, id);
        //course.getEstudiantes().forEach(u -> u.getCourses().remove(course));
        
        for(Student student : course.getEstudiantes()) {
            student.getCourses().remove(course);
        }
        currentSession.save(course);
        if(course.getId() == null)
            return true;
        
        else
            return false;
    }
  • Related