私のアプリケーションでは、次のような設定があります。
class A {
String id;
List<C> list;
}
class B {
String id;
List<C> list;
}
class C {
String id;
}
休止状態のようにマップされます
<class name="A" lazy="false">
<id name="id">
<generator class="org.hibernate.id.UUIDGenerator"/>
</id>
<list name="list" lazy="false" mutable="false">
<key column="listA_id"/>
<list-index column="listA_index"/>
<many-to-many class="C"/>
</list>
</class>
<class name="B" lazy="false">
<id name="id">
<generator class="org.hibernate.id.UUIDGenerator"/>
</id>
<list name="list" lazy="false" mutable="false">
<key column="listB_id"/>
<list-index column="listB_index"/>
<many-to-many class="C"/>
</list>
</class>
<class name="C" lazy="false">
<id name="id">
<generator class="org.hibernate.id.UUIDGenerator"/>
</id>
</class>
5 つのテーブル (クラスごとに 1 つ、多対多リレーション用に 2 つ) がすべて期待どおりに作成されます。次のようなコードを実行すると、問題が発生します。
A a = new A();
B b = new B();
C c1 = new C();
C c2 = new C();
C c3 = new C();
<hibernatesession>.save(c1);
<hibernatesession>.save(c2);
<hibernatesession>.save(c3);
a.list.add(c1);
a.list.add(c2);
<hibernatesession>.save(a);
b.list.add(c1);
b.list.add(c3);
<hibernatesession>.save(b);
結果の SQL を HSQL ログ ファイルで追跡したところ、最後の保存まではすべて問題ないことがわかりました。b を保存すると、a と c1 の間の関連付けが多対多テーブル A_list から削除されます。オブジェクト a と b をデータベースから新たにフェッチすると、c1 と c3 が b.list に含まれますが、c2 のみが a.list に含まれます。
観察: * ゲームにはカスケードはありません。* a/b の保存順序を切り替えると、最初に保存された人のリストから c1 が削除されます。* どちらのリストもインデックスでマッピングされています。* 両方のリストは、異なるキー/インデックス列名でマップされます。* hibernate は、リストに共通する要素を正確に削除します
誰かが休止状態のこの動作を説明し、それぞれのマッピングを正しく実現する方法を知っていますか?
事前にthx!!! サルソラトラガス