我有以下场景:表 A 和表 B 具有多对多关系。A类映射到表A,B类映射到表B,并且有一个连接表AB。A 类具有 B 类集合,B 类具有 A 类集合。我有三个不同的用户界面来创建/更新 A、B 和 AB。当我在 A 的 UI 中加载 A 的信息时,我不想加载 B 的列表(性能原因)。因此,在保存 A 时,我只得到与 A 相关的信息,而 Set 为空。当我保存 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 为空或为空。当我保存这个 A 时,它会删除映射表的条目。
String aJson = "{aid:1, data:['newJsonData']}";
A a = JsonParser.parse(aJson);
session.saveOrUpdate(a);
表 AB 变为
aid | bid
----------
2 | 1
----------
有什么办法可以避免这种删除?