【问题标题】:How to automatically delete many-to-many associations (cascade)如何自动删除多对多关联(级联)
【发布时间】:2009-10-15 01:54:25
【问题描述】:

在我的数据库中,我有具有多对多关系的用户和用户组。 User有一组UserGroup,UserGroup域对象看不到User。

<class name="User" table="UserTable">
    <set name="UserGroup" cascade="save-update" access="field.pascalcase-underscore" table="User2UserGroup">
        <key column="User_Id" />
        <many-to-many class="UserGroup" column="UserGroup_Id" />
    </set>
    ...

我想要实现的是当我删除用户或用户组时从联结表中删除关联的休眠模式。此外,用户和组是子对象,我们称其为域。域是cascade="all-delete-orphans",因此当域被删除时,它会级联删除其所有用户和用户组。

回到 UserUserGroup 关系:如果我理解正确,我不能使用任何形式的涉及删除的级联,因为我只想删除两个对象之间的关联,而不是相关对象本身。 (一个组不会消失,即使它是一个孤儿。没有组的用户在我的世界里是一个有效的东西——他根本没有做任何事情的权利。)

我需要查看事件/拦截器吗?或者我可以通过控制映射来做我想做的事情吗?

【问题讨论】:

    标签: nhibernate many-to-many nhibernate-mapping cascade


    【解决方案1】:

    如果您使用的是支持它的数据库,您可以不以外键约束的形式在数据库本身上设置级联吗?

    【讨论】:

    • 这可能行得通,但我怀疑它可能会在 NHibernate 缓存中造成很多麻烦。
    • AFAIK 在 NHibernate 的数据库上使用级联删除没有问题。有关使用事件侦听器(在 NHibernate 2.1 中)解决此问题的讨论,请查看此文档:elegantcode.com/2009/07/19/…
    • 迈克尔,感谢您的所有输入和链接。因为我已经研究了事件侦听器的方向(事实上,我已经在我的应用程序中注册了一个无操作事件侦听器),这就是我将继续的方向。即使数据库能够删除幕后的东西(甚至可能快得多),我也不希望这样做,因为我想将所有内容都保留在同一层中。从我的应用程序的 pre-nhibernate-2 根目录中,我仍然有不健康的 SQL,而不是可执行的 HQL。
    猜你喜欢
    • 2011-03-15
    • 2015-02-21
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多