2

这是我的课

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

问题是,

第 1 节

第一步:获取Teacher id = 1,在同一个会话中调用session.initializeCollection(teacher.children)初始化学生

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

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

第 2 节:

第 1 步:在会话 1 的第 2 步之前获取教师 id = 1。使用 intializeCollection(teacher.children) 初始化孩子

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

//在这一步,hibernate id对Teacher进行更新并删除Student 1

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

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

有人可以解释为什么会发生这种情况以及应该如何处理该对象,以便在第 2 次会话中,通过对表的任何更改来刷新学生集合,即将任何子对象添加到表中?

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

4

1 回答 1

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。

于 2012-11-21T19:17:11.207 回答