次のシナリオがあります。テーブル 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
----------
この削除を回避する方法はありますか?