0

私の問題に関するこのスレッドを読みましたが、まだ質問がありました。

Order と Task の 2 つのエンティティがあります。Order とその子 Task の間には 1 対多の関係があります。

//Order.hbm.xml
<bag name="Tasks" table="Task" inverse="true" cascade="all-delete-orphan">
  <key column="OrderID" />
  <one-to-many class="Task, Orders" />
</bag>

//Task.hbm.xml
<many-to-one name="Order" column="OrderID" />

タスクを削除し、NHibernate で注文を同期させたいと考えています。

私の最初の試みで問題が発生しました:

削除されたオブジェクトはカスケードによって再保存されます

トランザクションをコミットする前に、Task への Order の参照を手動でクリーンアップすることで、これを解決しました。

public void DeleteTask()
{
    NHibernateSessionManager.Instance.BeginTransaction();
    //Need to remove Order's reference to Task before deleting so that Task is not resaved.
    Task.Order.Tasks.Remove(Task);
    TaskDao.Delete(Task);
    NHibernateSessionManager.Instance.CommitTransaction();
}

ただし、このコードは NHibernate の XML ファイルで処理できるはずです。これは正しい仮定ですか?Task が削除されたときに、その親 Order の参照も自動的にクリーンアップされるように、NHibernate の構成をどのように変更する必要がありますか?

4

1 に答える 1

3

実際には、あなたが持っているのでcascade="all-delete-orphan"、明示的ななしで行うことができますDelete():

public void DeleteTask()
{
    NHibernateSessionManager.Instance.BeginTransaction();
    Task.Order.Tasks.Remove(Task);
    NHibernateSessionManager.Instance.CommitTransaction();
}

NH への参照なしでモデル itelf から変更を行うことができ、NH の変更追跡に削除を処理させることができるため、これはより DDD 風です。

于 2012-09-12T12:45:41.830 に答える