hibernate不会删除带有命名查询的子节点,但会删除session.delete()

时间:2010-11-25 09:06:19

标签: hibernate

我不是hibernate的专家,正如主题所述,我有一个带有对象集合的Object。 我试过用

session.delete(myObject) 

并且具有所有相关子项的实体从数据库中正确删除。

但是当我运行一个简单的命名查询时:

<query name="deleteByID">
    DELETE FROM MyObject o WHERE o.objId IN (:objIds)
</query>

然后在代码中

Query deleteQuery = s.getNamedQuery("deleteByID");
deleteQuery.setParameterList("objIds", objIds);
return deleteQuery.executeUpdate();

但只删除了主要实体,而子项仍保留在数据库中。 该集合被正确标记为delete-orphan。我想知道为什么会出现这种行为,以及如何使用命名查询实现完全删除。

1 个答案:

答案 0 :(得分:4)

这是一个已知问题,hibernate不会通过HQL执行级联删除。如果加载对象并使用session.delete(object);将其删除,则会遵循级联关系。不是通过HQL。您有3个选项中的任何一个。

  • 加载并致电session.delete();
  • 通过HQL加载所有子项,删除它们,然后删除真实对象。
  • 在数据库级别添加级联链接。因此,当您删除它时,数据库将负责处理它。

在此处阅读更多内容:https://forum.hibernate.org/viewtopic.php?f=1&t=944722&start=0