1

次のクラスをマップしようとしています。

PessoaFisicaPessoaJuridica は Pessoaを継承し ます。 ClienteはPessoaと関連付けられており、PessoaJuridicaまたはPessoaFisicaの場合があります。

たとえば、 Cliente オブジェクトを PessoaFisica で保存すると、問題ありません。しかし、更新しようとしてプロパティ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 difference between all, all-delete-orphans and save-update

オプションの 1 つは、cascade="all-delete-orphan"あなたが求めているものと見なすことができるものです。

しかし

孤児のカスケード削除は、親子のシナリオ (親なし ==> 子なし) または 1 対 1 のマッピングでのみ正しいです。(つまり、子と親の逆ではありません)

あなたの場合、参照されたオブジェクトの削除を要求します。しかし、他の「子」によって参照されていない場合、NHibernate (まあ誰も) を知ることはできません。

以前に割り当てられたものを削除する必要がある場合Personは、いつでもコードで実行できますが、明示的に

于 2013-06-27T04:35:57.827 に答える