2010-11-25 58 views
4

我不是hibernate的专家,正如主题中所述,我有一个Object,其中包含一个对象集合。 我试图用hibernate不会删除带有命名查询的子项,但会删除session.delete()

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(); 

,但只有主实体被删除,而孩子们留在数据库中。 集合正确标记为删除孤立。我想知道为什么会出现这种行为,以及是否有可能通过命名查询来实现彻底删除。

回答

4

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

  • 加载它们,并通过调用HQL session.delete();
  • 加载所有的子项,删除它们,然后真正的对象。
  • 在数据库级别放置级联链接。所以当你删除它时,DB会照顾它。

在这里阅读更多:https://forum.hibernate.org/viewtopic.php?f=1&t=944722&start=0