2

次のシナリオがあります。テーブル A とテーブル B には多対多の関係があります。クラス A はテーブル A にマップされ、クラス B はテーブル B にマップされ、結合テーブル AB があります。クラス A にはクラス B のセットがあり、クラス B にはクラス A のセットがあります。A、B、および AB を作成/更新するための 3 つの異なるユーザー インターフェイスがあります。A の UI に A の情報をロードするときに、B のリストをロードしたくありません (パフォーマンス上の理由)。したがって、A を保存している間は、A に関連する情報のみを取得し、Set は null です。この A のインスタンスを保存すると、A と B の間のすべての既存のマッピングが削除されます。休止状態はそのような保存を許可しますか? それとも、A を保存する前に常に Set を設定する必要がありますか?


データベース テーブル A:

aid | data
---------

Database table B:

bid | data
---------

Database table AB:

aid | bid
----------

Class A{
    private long aid;
    private String data;
    private Set<B> bSet;
}

Class B{
    private long bid;
    private String data;
    private Set<A> aSet;
}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name='test.A' table='A'>
        <id name='aid' type='long' column='aid'>
        </id>
        <set name="bSet" table="AB"
            inverse="false" fetch="select" cascade="save-update">
            <key>
                <column name="aid" not-null="true" />
            </key>
            <many-to-many entity-name="test.B">
                <column name="bid" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name='test.B' table='B'>
        <id name='bid' type='long' column='bid'>
        </id>
        <set name="aSet" table="AB"
            inverse="false" fetch="select" cascade="save-update">
            <key>
                <column name="bid" not-null="true" />
            </key>
            <many-to-many entity-name="test.A">
                <column name="aid" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

私のテーブルにはすでに次のデータがあります

表 A

aid | data 
---------
1   | [json data_a1]
--------------------
2   | [json data_a2]
--------------------

表 B

bid | data
-----------
1   | [json data b1]
--------------------
2   | [json data b2]

表AB

aid | bid
----------
1   | 1
----------
1   | 2
----------
2   | 1
----------

ここで、A を更新する場合 (ID 1 など)、A.data のみが入力されます (UI は A に関連するデータのみを送信します。AB マッピングについては何も知りません)、a.bSet は null または空です。そして、この A を保存すると、マッピング テーブルのエントリが削除されます。

String aJson = "{aid:1, data:['newJsonData']}";
A a = JsonParser.parse(aJson);
session.saveOrUpdate(a);

テーブルABは次のようになります

aid | bid
----------
2   | 1
----------

この削除を回避する方法はありますか?

4

1 に答える 1

1

merge()ではなくを使用saveOrUpdate()し、マージ時にセットを null セットにリセットしないようにします。

String aJson = "{aid:1, data:['newJsonData']}";
A detachedA = JsonParser.parse(aJson);
A existingA = (A) session.get(A.class, detachedA.getId());
Set<B> bs = existingA.getBs(); // save the Bs to restore them afterwards
session.merge(detachedA);
existingA.setBs(bs); // restore the Bs
于 2013-06-02T14:20:07.000 に答える