删除父引用时删除子对象
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" 以确保没有孤儿。
我有以下休眠映射:
<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" 以确保没有孤儿。