hibernate许多关系级联

时间:2011-06-10 16:41:44

标签: java hibernate

新手到休眠我有两个表A和B,它们有多个关系由表AB(A_ID和B_ID)定义,外键引用A.A_ID和B.B_ID,并在删除和更新定义上级联。 / p>

我已经映射了

a.hbm.xml有

<set name="bSet" table="AB" inverse="true" lazy="false" fetch="select" cascade="all">
    <key>
        <column name="A_ID" not-null="true" />
    </key>
    <many-to-many class="objectB" >
        <column name="B_ID" not-null="true" />
    </many-to-many>
</set>

b.hbm.xml有

<set name="aSet" table="AB" inverse="false" lazy="false" fetch="select" cascade="all">
    <key>
        <column name="B_ID" not-null="true" />
    </key>
    <many-to-many class="objectA">
        <column name="A_ID" not-null="true" />
    </many-to-many>
</set>

//ObjectA.java has
private Set<ObjectB> bSet = new HashSet<objectB>(0);

//ObjectB.java has
private Set<ObjectA> aSet = new HashSet<objectA>(0);

从前端发送A对象作为带有B的集合的json,表A在AB未被触及时正确更新。

有人可以指出我哪里错了吗? 这是JSON

{
    "a_field1": "value1",
    "a_field2": "value2",
    "aId": 1,
    "bSet": [
        {
            "bId": 100
        },
        {
            "bId": 200
        }
   ],
    "a_field3": "value3"
}

最初,db在AB表中设置了3条记录

(1,100) 
(1,200) 
(1,300)

db中的最终结果应该是

(1,100) 
(1,200) 

应该删除最后一行(1,300)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我最好的猜测(您没有提供处理请求的服务器代码的任何示例)是您只更新双向关联的一侧。换句话说,您只是反序列化A实例并进行合并。如果你得到一个新的A,你仍然需要合并A实例,但你还需要加载A不再引用的所有B,并从列表中删除A实例,并查找A新引用的所有B。并在其列表中添加A.这是代码中双向关系的危险之一。