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