java - Hibernate Merge 不刷新集合并导致删除

标签 java hibernate

这是我的类(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 步中重新附加

最佳答案

The merge() method merges modifications made to the detached instance into the corresponding managed instance, if any, without consideration of the state of the persistence context. In other words, the merged objects state overrides the persistent entity state in the persistence context, if one is already present.

getStudents 是惰性的,因此该集合永远不会在您的 session 2 中具体化。当您调用 merge 时,它​​会看到一个空集合并假定这就是您想要的,因此它将学生从持久对象中删除。在 session 2 中,您应该确保在合并或添加新学生之前调用 getStudents。

关于java - Hibernate Merge 不刷新集合并导致删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500349/

相关文章:

java - 使用级联持久化实体时获取子id

java - 无法添加或更新子行 : a foreign key constraint fails Hibernate

java - 如何实现HAPI FHIR资源道?

java - java 1.8下无法启动eclipse

java - Spring内存使用率过高

java - 为什么需要使用mappedBy注解?

java - 查询没有返回唯一结果: 3; nested exception is javax. persistence.NonUniqueResultException:(Spring JPA项目)

java - 如何实例化 EntityManager(无法构建 Hibernate SessionFactory)

java - 如何在最后一个操作中的操作链接后获取表单数据

java - 我如何使用 Java webstart 多个依赖的 native 库?