0

私のアプリケーションでは、次のような設定があります。

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 は、リストに共通する要素を正確に削除します

誰かが休止状態のこの動作を説明し、それぞれのマッピングを正しく実現する方法を知っていますか?

事前にt​​hx!!! サルソラトラガス

4

2 に答える 2

0

バグを修正しました。学んだ教訓: 休止状態の特定のコレクション間に奇妙な相関関係がある場合は、最初にそれらに同じ Java インスタンスを誤って使用していないかどうかを確認してください... 休止状態を介してペアデバッグを数時間行った結果、正しい推測にたどり着きました。トリッキーなこと。問題が解決しました。

ブラッドのヒントをありがとうございます!

于 2012-05-04T16:52:08.340 に答える
0

クラス C に多対多のマッピングを追加して、双方向の関係になるようにしてください。おそらく、「親」関係について明示することで、説明したように最初の関係を削除するのではなく、複数の関係を保持することがわかります。

<class name="C" lazy="false">
    <id name="id">
        <generator class="org.hibernate.id.UUIDGenerator"/>
    </id>
    <list name="listA" lazy="false" mutable="false" inverse="true">
        <key column="listC_id"/>
        <many-to-many class="A"/>
    </list>
    <list name="listB" lazy="false" mutable="false" inverse="true">
        <key column="listC_id"/>
        <many-to-many class="B"/>
    </list>
</class>
于 2012-05-03T15:56:45.773 に答える