0

关于休眠和删除孤儿级联的问题。假设我有一些 Parent 类,里面有 Child 的集合。在一对多关系的父类的休眠映射中,我设置了级联全部删除孤儿。假设所有其余部分都配置正确。

所以,我用两个子对象 A 和 B 加载父 P。然后我从父集合 (.getChildren().remove(A)) 中删除子 A 并调用 session.saveOrUpdate(P) 来保存父对象。由于设置了 all-delete-orphan 级联,父对象与一个子对象一起保存,另一个已删除的子对象 (A) 从 DB 中删除。这是正确的行为。

据我了解,当休眠加载此类对象(P)时,它会将其子列表包装到某个持久集合(例如 PersistentSet)中,并且该集合的所有操作都被休眠拦截,这允许它决定应该从数据库中孤立地删除哪些孩子。

但是..我有以下项目架构:

在实体从 db(DO 对象)加载后,它被传递到服务(外观对象),在那里它使用 Dozer 框架转换为对象。在转换后,来自 DO 对象的持久集合被转换为 TO 中的简单 ArrayList。然后将其传递到 UI 以进行修改(从子集合中删除子 A)。当我们想要保存它时,我们将它传递给外观,使用 Doser 将它转换回 DO 对象,然后我们将它保存到 DB(使用 session.saveOrUpdate)。

在这种情况下,级联不起作用,并且删除的孩子不是孤立的。它仍然呈现在 db 中。

只有当我们调用 saveOrUpdate 的 .merge insted 时,级联才有效。我认为这是因为 hibernate 自动将我们的对象绑定到会话,然后对其进行更新。

那么,谁能描述我这种行为?是否可以使用这种 DO -> TO -> DO 转换来支持删除孤儿级联?

这只是常见的场景和常见的问题。如果需要,我将能够附加代码/映射等。

4

1 回答 1

0

session.saveOrUpdate 用于跟踪的实体, session.merge 用于未跟踪的实体

session.merge 适用于这种情况。您有一个未跟踪的实体,其中包含应写回的更改。合并将根据您给它的对象的 id(注意:级联)加载实体,并将状态复制到这些跟踪的实体,并且更改将在下次刷新时保存。

于 2012-04-08T11:40:35.407 回答