【问题标题】:Hibernate cascade delete on a bag一个包上的休眠级联删除
【发布时间】:2010-04-28 09:22:56
【问题描述】:

在使用 NHibernate 构建了我的大部分 DAL 之后,我现在发现在我的 HBM 文件中也需要考虑 SQL Server 的 Cascade On Delete 规则。我一直在为我的所有收藏品使用包,但似乎没有办法将 cascade="delete" 属性添加到包中。我可以将我所有的包都改成套装,但这似乎意味着我已经将我模型上的所有 ILists 都改成了 PersistentGenericSets,我真的不喜欢这样做。

有什么建议吗?

安东尼

【问题讨论】:

    标签: nhibernate orm


    【解决方案1】:

    有两个独立但相关的概念:NHibernate 的级联规则和 DB 级联。

    后者实际上是在key元素上配置的,所以如果FK有ON DELETE CASCADE,包应该是这个样子:

    <bag name="Children" ...>
      <key column="ParentId" on-delete="cascade"/>
      <one-to-many class="Child"/>
    </bag>
    

    【讨论】:

    • 这是正确的,但我想指出从 NHibernate 创建数据库脚本时使用了 on-delete 设置。它将使用删除级联创建一个外键。它不会级联删除您的对象。
    • 实际上,它修改了 NHibernate 的行为,因为它现在知道 on delete cascade 行为的存在,所以,如果你有cascade="all",它将依赖数据库来做它而不是一个一个地删除子对象。
    • 刚刚尝试过,我收到以下错误:只有反向一对多关联可以使用 on-delete="cascade"
    • 是的,你需要使关联双向(子项必须有对Parent的引用)并将inverse="true"放入包中。
    【解决方案2】:

    您可以将级联属性添加到包映射。 documentation 列出了属性cascade="all|none|save-update|delete|all-delete-orphan" 的几个选项。一对多关系最常用的选项是all-delete-orphan。将 cascade 设置为该值将导致所有数据库操作被级联到集合中,如果子对象从集合中移除(孤立),它们将被删除。

    数据库级联类似,但不提供自动删除孤立子记录的功能。在 NHibernate 和数据库中设置 cascade 选项有些多余,但如果您有其他系统直接访问数据库,可能会很有用。

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 1970-01-01
      • 2011-12-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2011-04-17
      相关资源
      最近更新 更多