有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

HibernateJava中的迭代器错误问题。util。ConcurrentModificationException:null

我试图删除课程学生中的所有元素,但我得到一个例外,它只允许我删除第一个元素。如何从关联中删除所有元素,甚至尝试使用迭代器。如果有任何例子的话,它将帮助我很多

这是我的代码,它工作正常,除非我尝试删除更多意外事件

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

}

班级课程

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

}

例外情况

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]

共 (1) 个答案

  1. # 1 楼答案

    我已经解决了,希望有帮助

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