休眠映射:删除孤立级联



有关休眠和删除孤立级联的问题。假设我有一个Parent类,里面有Child集合对于一对多关系,我设置级联所有删除孤立。假设所有其余部分都配置正确。

因此,我用两个子对象A和B加载Parent p。然后从父集合(.getChildren().remove(A))中删除子对象A,并调用session.saveOrUpdate(p)来保存Parent对象。当设置了所有删除孤立级联时,父对象将与一个子对象一起保存,另一个已删除的子对象(A)将从DB中删除。这是正确的行为。

据我所知,当hibernate加载这样的对象(p)时,它会将其子项列表包装到某个Persistent集合(例如PersistentSet)中,并且hibernate会拦截该集合的所有操作,这使它能够决定哪些子项应该单独从db中删除。

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

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

在这种情况下,级联不起作用,删除的子项不会成为孤立项。它仍然在数据库中显示。

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

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

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

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

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

最新更新