私が開発した Web アプリケーションには、かなり複雑な保存ルーチンがあります。ユーザーは一連の計画を作成して変更し、データを保存することを選択します。すべての追加、削除、および変更は、この時点で一度に保存されます (すべて 1 つのトランザクション内)。
Plan
Collection Of Child
Collection of ChildDetail
保存の大部分は、計画オブジェクトで SaveOrUpdate を呼び出し、この保存に計画とその子を管理させることによって実行されます。新しいレコードを挿入するときは未保存の値としてゼロを使用し、cascade=all-delete-orphan を使用して、クライアント側で子オブジェクトまたは子詳細オブジェクトが削除された場合にオブジェクトが削除されるようにします。
ただし、次の場合に例外が発生します: ユーザーが子オブジェクトを使用してプランを作成し、それらを保存します。これで問題なく保存されます。
Plan(id=0)
Child[0](id=0), Child[1](id=0), Child[2](id=0)
その後、ユーザーが子オブジェクトを削除し、その場所に新しい子オブジェクトを追加してから、変更を保存しようとした場合。
Plan(id=123)
Child[0](id=0), Child[1](id=0), Child[2](id=0)
これにより、GenericAdoException がスローされ、子を挿入できず、内部例外 "SQL0803 Duplicate Key Value Specified" が発生します。
私が探している動作は、NHibernate が以前の Child オブジェクトを削除し、プランで SaveOrUpdate が呼び出されたときに新しいオブジェクトを挿入することです。親に関係を管理させながら、どうすればこれを達成できますか?