NHibernate和级联删除

时间:2010-07-13 15:00:30

标签: nhibernate

我们有一个非常深的对象图,我们需要一种方法来删除对象图的根,它需要快速发生。我们在谈论大约10-15个表中的1000行。我们还将所有集合映射为AllDeleteOrphan。我们跳过NH将通过外键执行删除,但它实际上对集合中的每个项目执行删除。你如何处理这样的情况?

2 个答案:

答案 0 :(得分:2)

在需要进行批量操作的情况下,您可能希望直接在服务中执行某些hql / sql。 ORM工具提供了很多便利,但有时候直接处理sql更好。我们有类似的情况,我们不得不做一个对象图的深层复制 - 用休眠花了10分钟,用我刚刚描述的方法花了2秒......

编辑 - 我认为你的担忧“泄漏了域外的任何东西”,我认为你的意思是你不想混淆问题。通过我描述的方法,您仍然可以将您的关注点正确分开 - 我说将hql方法放在服务中,但我的意思是可以在DAO中完成。所有持久性代码都在一个地方。

在我们的情况下,我们花了很多时间尝试调整hibernate并找到使其更快的方法。当一个高级数据库人告诉我只是在hql中执行它时,通过适当的测试实现它需要大约4个小时才完成....你真的应该考虑这种方法来节省时间......

答案 1 :(得分:0)

我相信你对on-delete="cascade"属性感兴趣;请参阅示例映射:

    <set name="Children" table="Child" cascade="save-update" lazy="true" inverse="true">
        <key column="ParentId" not-null="true" on-delete="cascade" />
        <one-to-many class="Child" />
    </set>

关于此的几点说明:

  1. 这仅适用于关系的反面
  2. 如果它与您的域模型不完全匹配,则可以使用access =“none”完成相同的映射(如果使用模式导出生成数据库,仍会创建正确的级联删除)
  3. 如果您想将此行为完全保留在对象模型中,我建议您查看this post,其中讨论了使用集合事件侦听器执行一次性删除。