1

我正在尝试映射以下类:

PessoaFisicaPessoaJuridica 继承 PessoaClientePessoa关联,可能是PessoaJuridicaPessoaFisica

例如,当我使用PessoaFisica保存Cliente对象时,没关系。但是当我尝试更新并将属性PessoaCliente设置为PessoaJuridica并尝试更新时,它会更新,但它会在表 TB_PESSOA 中生成一个新行,并且 PessoaFisica 中的旧行不会被删除。它为PessoaJuridica创建了一个新行,但旧行仍然存在。我的映射 XML 有什么问题?为什么 NHibernate 在插入新的多态对象之前不删除旧行?

这些是我正在使用的映射文件

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="SALClassLib.Masterdata.Model" assembly="SALClassLib">
<class name="Pessoa" table="TB_PESSOA">
<id name="Id">
  <column name="ID_PESSOA" not-null="true"/>
  <generator class="increment" />
</id>

(other properties...)

<joined-subclass name="PessoaFisica" table="TB_PESSOA_FISICA">
    <key column="ID_PESSOA" />
    (other properties...)
</joined-subclass>

 <joined-subclass name="PessoaJuridica" table="TB_PESSOA_JURIDICA">
    <key column="ID_PESSOA" />
    (other properties...)
 </joined-subclass>
 </class>

<class name="Cliente" table="TB_CLIENTE">
<id name="Id">
  <column name="ID_CLIENTE" not-null="true"/>
  <generator class="increment" />
</id>
<many-to-one name="Pessoa" class="Pessoa" cascade="all" column="ID_PESSOA" not-null="true" unique="true" />

谢谢

4

1 回答 1

2

NHibernate 级联在这里得到了很好的解释:NHibernate Cascades: the different between all, all-delete-orphans and save-update

一种选择是cascade="all-delete-orphan"可以将其视为您所要求的。

孤儿的级联删除仅在父子场景(无父 ==> 无子)或一对一映射中是正确的。(即不是相反的孩子父母)

在您的情况下,您确实要求删除引用的对象。但是NHibernate(没有人)可以知道,如果它没有被其他一些“孩子”引用。

如果您需要删除以前Person分配的内容,您始终可以在代码中执行此操作 - 但要明确

于 2013-06-27T04:35:57.827 回答