Java 已删除的实例传递给合并错误-了解在某些情况下发生这种情况的原因

Java 已删除的实例传递给合并错误-了解在某些情况下发生这种情况的原因,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我使用Spring数据JPA在学校和学生实体之间建立了一对多关系 在尝试检索当前学生列表并使用下面的代码删除他们时,我遇到了以下错误 School school = schoolRepo.findOne(schoolId); Set<Student> students = school.getStudents(); studentRepo.delete(students); schoolRepo.saveAndFlush(school); 已删除传递给合并的实例:[com.api.

我使用Spring数据JPA在学校和学生实体之间建立了一对多关系

在尝试检索当前学生列表并使用下面的代码删除他们时,我遇到了以下错误

School school = schoolRepo.findOne(schoolId);
Set<Student> students = school.getStudents();
studentRepo.delete(students);
schoolRepo.saveAndFlush(school);
已删除传递给合并的实例:[com.api.beans.Student]

但是,当我使用如下自定义查询修改代码的getStudents部分时,它工作得非常好

其中findBySchool自定义查询在studentRepo中定义如下

 @Query("SELECT s FROM Student s WHERE  s.school.schoolId =:schoolId")
 Set<Student> findBySchool(@Param("schoolId") Long schoolId);
为什么会这样?我觉得我缺少一些概念上的清晰性,我希望能够理解这一点

基本上,这两条线的区别是什么

Set<Student> students = school.getStudents();
Set<Student> students = studentRepo.findBySchool(schoolId);

为什么第一行给出一个错误,而第二个方法工作正常?

JPA不会为您清理对象模型-由您来保持它与您在数据库中所做的同步。如果要删除学生,应首先从其他实体中删除对学生的任何引用。在这种情况下,请事先致电school.getStudents.clear等。你的代码可能在相反的情况下工作,因为在学生还没有被移除之前,学校的学生参考还没有从数据库中取出来。此外,如果你的应用程序的商业规则禁止学校的学生存在,学校是拥有的一方,考虑使用孤儿删除=真。清除school.students就足够了JPA不会为您清理对象模型-由您来保持它与您在数据库中所做的同步。如果要删除学生,应首先从其他实体中删除对学生的任何引用。在这种情况下,请事先致电school.getStudents.clear等。你的代码可能在相反的情况下工作,因为在学生还没有被移除之前,学校的学生参考还没有从数据库中取出来。此外,如果你的应用程序的商业规则禁止学校的学生存在,学校是拥有的一方,考虑使用孤儿删除=真。离开学校,学生们就足够了
Set<Student> students = school.getStudents();
Set<Student> students = studentRepo.findBySchool(schoolId);