Hibernate映射:delete-orphan cascade

时间:2012-04-01 20:37:55

标签: hibernate cascade all-delete-orphan

有关hibernate和delete-orphan级联的问题。假设我有一些Parent类,其中包含Child的集合。在父类的hibernate映射中 对于一对多关系,我设置了级联all-delete-orphan。假设所有其余部分都配置正确。

因此,我使用两个Child对象A和B加载Parent P.然后从父集合中删除子A(.getChildren()。remove(A))并调用session.saveOrUpdate(P)来保存Parent对象。设置all-delete-orphan级联时,父对象将保存为一个子级,另一个已删除的子级(A)将从DB中删除。这是正确的行为。

据我所知,当hibernate加载这样的对象(P)时,它会将其子列表包装到一些Persistent集合中(例如PersistentSet),并且所有使用此集合的操作都会被hibernate拦截,这使得它可以决定从哪个子句中删除orphanly分贝。

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

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

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

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

那么,有人能描述我这种行为吗?是否有可能使用这样的DO支持删除孤立级联 - > TO - > DO转型?

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

1 个答案:

答案 0 :(得分:0)

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

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