マッピングを少し変更した後 ( 理由については、cascade-delete に関する他の質問を参照してください)、完全に新しいオブジェクトとそのすべてのサブクラスを挿入しようとしました。
この別の問題が発生した後、データベースへのキーの挿入に関する問題が発生しました。状況は次のとおりです。
どちらもコレクションである 2 層のサブクラスを持つオブジェクトがあります。
オブジェクトを親と呼びましょう。これには子のコレクションがあり、このコレクション内のすべてのエンティティには独自のエンティティのコレクションがあります。次のようにマッピングされます。
親のマッピング<set>
<!--Parent-->
<set name="Collection"
table="Table"
cascade="all-delete-orphan"
batch-size="15"
inverse="true">
<key column="ParentID"/>
<one-to-many class="CollectionObject,CollectionObject-ns"/>
</set
CollectionObject のマッピング
<id name="ID" column="ID">
<generator class="native"/>
</id>
<!-- property mappings-->
<property name="ParentID" column="ParentID" not-null="true"/>
<!--collection mapping-->
<set name="Collection"
table="Table"
cascade="all-delete-orphan"
inverse="true"
batch-size="15">
<key column="ChildID"/>
<one-to-many class="CollectionObject,CollectionObject-ns"/>
</set>
2 番目のコレクション内のオブジェクトのマッピング マッピングは、上記と同様です。想定されるシナリオは、親を保存すると、サブクラス/コレクションの保存がトリガーされるというものです。
たとえば、ID = 1 の親があり、親には 1 つのコレクションがあり、このコレクションには独自のコレクションが 1 つあります。
親を保存すると、親はデータベースから ID を取得します (ネイティブ SQL ID)。これで、最初のコレクションの ParentID プロパティに、Parent がデータベースから取得したばかりの ID が入力されます。また、コレクションのコレクションは、親が ID を取得したのと同じ方法で、子がデータベースから取得した ID で満たされた ChildID を取得する必要があります。
今起こっていることは(NHProfで作成されたSQLをチェックしました)すべてが独自のIDで挿入されますが、コレクションは親クラスのIDで満たされたキー列を取得しません。(代わりに、0 が挿入されるだけです)
要するに、私の質問は、マッピングに何を追加するのを忘れたのかということです。キー列は、私がすべきだと思うことをしませんか?
ここに何か追加するのを忘れた場合は、そう言ってください。喜んで追加情報を提供します。
アップデート
<many-to-one>
問題は、子供にタグがないことに関係しているのではないかと思います。そこで、そのうちの 1 つを最初の子マッピングに追加しようとしました。私はこれを思いついた
<many-to-one name="ParentID"
class="Parent,Parent-ns"
column="ParentID"
not-null="true"/>
ただし、このセットアップでは次のエラーが発生します。
Exception occurred getter of Parent.ParentID
InnerException あり
{"Object does not match target type."}
悲しいことに、このエラーでは、続行する場所についてのアイデアが得られません。