Hibernate映射:delete-orphan cascade

问题描述:

关于hibernate和delete-orphan级联的问题。假设我有一些Parent类,里面收集了Child。在父类 的一对多关系的休眠映射中,我设置了cascade all-delete-orphan。假设其余所有配置都正确。然后,我从父集合(.getChildren()。remove(A))中移除子A并调用session.saveOrUpdate(P)来保存父对象。由于设置了全部删除孤立级联,父对象将与一个孩子一起保存,而另一个已删除的孩子(A)将从数据库中删除。这是正确的行为。Hibernate映射:delete-orphan cascade

据我了解,当休眠负载,对象(P),它会返回其子列表到一些持久性集合(如PersistentSet)以及与此集合中的所有操作都是由Hibernate拦截,这允许它来决定哪个孩子应该orphanly删除从数据库。

但是..我有后续项目架构:

实体是从数据库(DO对象)将其传递到那里它被转换使用推土机架构,服务对象(门面对象)装载机后。转换后,将DO对象中的持久性收集转换为TO中的简单ArrayList。然后它被传递到UI ,在那里它可以被修改(从子集合中删除子A)。当我们把它保存下来时,我们将它传递给facade,使用Doser将其转换回DO对象,然后将它保存到数据库(使用session.saveOrUpdate)。

在这种情况下,级联不起作用,并且移除孩子不是孤儿。它仍然以db的形式呈现。

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

那么,任何人都可以描述我这种行为?是否可以使用这种DO - > TO - > DO转换来支持删除孤立级联?

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

session.saveOrUpdate是跟踪实体,session.merge是未经跟踪的entites

session.merge是为这个场景。你有一个未被跟踪的实体,其变化应该被写回。合并将根据你给它的对象的id(注意:级联)加载实体,并将状态复制到这些被跟踪的实体上,并在下一次刷新时保存更改。