【问题标题】:Hibernate Merge not refreshing collection and causing deletesHibernate Merge 不刷新集合并导致删除
【发布时间】:2012-11-21 19:08:42
【问题描述】:

这是我的课程

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 步:执行合并以在会话 1 中完成任何更改(在第 3 步之后)

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

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

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

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

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    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。

    【讨论】:

    • 我更新了步骤,我在步骤 1 中初始化了子集合,所以我假设惰性集合不会有问题。
    • 在会话 2 中,您仍然拥有没有在会话 1 中添加的学生的集合,这就是为什么在会话 2 中合并时将其删除。您没有正确考虑“合并”。你说Step 2: Perform a merge to get any changes done in Session 1 (after Step 3) 但这不是合并的作用。再次阅读我粘贴的文档。根据行为,我猜您没有实体的版本列?这可能有助于为您缓解这个问题。
    • 好的,看起来我完全误解了合并。那么在这种可以同时更新子集合的情况下使用的正确模式是什么。我想最好的方法是直接插入子级而不使用级联操作在父级上进行合并,或者在添加任何子级之前完全重新获取父级(如果使用合并)?要求是可以同时添加孩子。我尝试在父级和子级上使用版本列,但结果相同。
    • 最好的方法是有一个版本列。 Hibernate 或 JPA 将使用该列。然后,当您尝试写入对象时,如果您当前的版本与数据库中的版本不同,您将收到异常,然后您将知道您已过时,此时您从数据库中刷新您的对象,应用再次更改,然后再次尝试保存。
    • 如果我使用版本列,它是在父级还是在子级。如果我在父对象上使用它,即使我不对父对象字段进行任何更改而只是从子集合中添加/删除它也会更新吗?
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多