删除父引用时删除子对象

Delete child objects when parent reference is deleted

我有以下休眠映射:

<class name="Folder" >
    <id name="Id">
        <generator class="native"/>
    </id>
    <many-to-one name="Owner"
         not-null="false" fetch="select" column="OwnerFK" not-found="ignore" lazy="proxy" />
    <property name="Name" />
    <many-to-one name="ParentFolder" column="ParentId" 
        not-found="ignore" lazy="proxy" not-null="false"/>
</class>

ParentId 列引用相同 table 的 Id,这样我就知道子文件夹是哪个父文件夹创建的。

当我删除父文件夹时,我希望子文件夹也被删除,如果只删除子文件夹,那么父文件夹应该不会受到影响。

我在 parentId 列上尝试了 cascade="all",但是当我只删除子文件夹时删除了我的父文件夹。

这可以使用 Hibernate 实现吗?

没有NHibernate做不到这一点。您需要让模型列出结构并删除每个对象,因为您的 NHibernate 映射到父对象而不是子对象。

是的,这可以使用 Hibernate 来实现。您将不得不稍微更改一下映射。

<class name="Folder" >
    <id name="Id">
        <generator class="native"/>
    </id>
    <many-to-one name="Owner"
         not-null="false" fetch="select" column="OwnerFK" not-found="ignore" lazy="proxy" />
    <property name="Name" />

    <many-to-one name="ParentFolder" column="ParentId" 
        not-found="ignore" lazy="proxy" not-null="false"/>

    <bag name="ChildFolders" cascade="delete" inverse="true" fetch="select">
       <key column="ParentId" not-null="false"/>
       <one-to-many class="Folder"/>
    </bag>
</class>

每个元素都可以有一个父元素和一个子元素,因此您需要一个包来获取子元素,并需要一个多对一的元素来获取父元素。

因此,当您尝试删除父级时,您的子级会出现 cascade="delete" 以确保没有孤儿。