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

时间:2012-11-21 19:08:42

标签: java hibernate

这是我的课程

class Teacher {
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
Set<Students> getStudents()
}

问题是,

第1节

步骤1:获取教师ID = 1,通过在同一会话中调用session.intitializeCollection(teacher.children)来初始化学生

第2步:添加新学生(id = 1)

步骤3:合并教师实例以插入添加的学生

第2节:

步骤1:在会话1中的步骤2之前获取教师ID = 1.使用intializeCollection(teacher.children)初始化子项

步骤2:执行合并以在会话1(步骤3之后)中完成任何更改

//在此步骤中,hibernate id对Teacher进行更新并删除Student 1

第3步:添加另一个学生(id = 2)并合并教师以保存学生(id = 2)

我假设当在步骤2中完成合并2时,它将导致使用在会话1中完成的更改来刷新集合,即将新对象从会话1添加到会话2,子集合。

有人可以解释为什么会发生这种情况以及如何处理对象,以便在第2节中,对表格进行任何更改即刷新学生集合,即将任何子对象添加到表格中吗?

同样只是注意,在步骤1之后,教师对象是一个分离的实例,因为该对象被传递到基于Web的视图层并在步骤2中修改并在步骤3中重新附加

1 个答案:

答案 0 :(得分:0)

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是懒惰的,因此集合永远不会在你的会话中实现2.当你调用merge时,它会看到一个空集合并假设你想要的东西,所以它会从持久对象中删除学生。在第2节中,您应确保在合并或添加新学生之前调用getStudents。