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



这是我的类

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

问题是

会话1

步骤1:获取教师id=1,通过调用会话初始化学生。初始化收集(教师.儿童)在同一会话

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

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

会话2:

第1步:在第1课时的第2步之前获取教师id=1。使用initializeCollection(教师.儿童)初始化儿童

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

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

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

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

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

同样需要注意的是,在步骤1之后,教师对象是一个分离的实例,因为该对象被传递到基于web的视图层,并在步骤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是懒惰的,因此该集合从未在您的会话2中具体化。当您调用merge时,它会看到一个空集合,并假设这就是您想要的,因此它会从持久对象中删除学生。在第2节中,您应该确保在合并或添加新学生之前调用getStudents。

最新更新