代码之家  ›  专栏  ›  技术社区  ›  Leonardo

hibernate不删除带有命名查询的子项,而是使用session.delete()删除子项

  •  4
  • Leonardo  · 技术社区  · 14 年前

    我不是hibernate的专家,正如主题中所述,我有一个对象,其中包含一个对象集合。 我试着用

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

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

    1 回复  |  直到 9 年前
        1
  •  4
  •   Varun Mehta    14 年前

    这是一个已知的问题,hibernate不通过HQL执行级联删除。如果加载对象并使用 session.delete(object); 这样就尊重了级联关系。不是通过HQL。你有三个选择之一。

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

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