这是我的类(class)
class Teacher {
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
Set<Students> getStudents()
}
问题是,
第 1 节
第一步:获取Teacher id = 1,在同一个session中调用session.intitializeCollection(teacher.children)初始化student
第2步:添加一个新的Student(id=1)
第三步:合并teacher实例导致添加student的插入
第 2 节:
第 1 步:在 session 1 的第 2 步之前获取 Teacher id = 1。使用 intializeCollection(teacher.children) 初始化 child
第 2 步:执行合并以完成 session 1 中的任何更改(第 3 步之后)
//在这一步,hibernate id 更新了 Teacher 并删除了 Student 1
第三步:再添加一个Student(id=2)并合并老师保存Student(id=2)
我假设当合并 2 在步骤 2 中完成时,它会导致集合使用 session 1 中完成的更改进行刷新,即将 session 1 中的新对象添加到 session 2,即子集合。
有人可以解释为什么会发生这种情况以及应该如何处理该对象,以便在 session 2 中,学生集合会随着对表的任何更改而刷新,即将任何子对象添加到表中吗?
另外请注意,在第 1 步之后,teacher 对象是一个分离的实例,因为该对象已传递到基于 Web 的 View 层并在第 2 步中修改并在第 3 步中重新附加
最佳答案
getStudents 是惰性的,因此该集合永远不会在您的 session 2 中具体化。当您调用 merge 时,它会看到一个空集合并假定这就是您想要的,因此它将学生从持久对象中删除。在 session 2 中,您应该确保在合并或添加新学生之前调用 getStudents。
关于java - Hibernate Merge 不刷新集合并导致删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500349/