2011-06-10 177 views
4

新手到休眠我有两个表A和B有多对多关系定义的表AB(A_ID和B_ID)外键引用A.A_ID和B.B_ID和级联在删除和更新定义。休眠多对多关系cascade

我已映射

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); 

从前端发送目的与集的JSON的B的表A正在更新正确,而AB是不变的。

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

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

最初的DB是在AB表

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

在db最终结果应该是

(1,100) 
(1,200) 

最后一排设置了3个记录(1,300)应该已被删除。

任何帮助,非常感谢。

  • 沙阿

回答

1

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

+0

是这是缺少的链接之一,我也不得不删除级联和inverse =“false”。这就是它。 – Shah 2011-06-10 20:23:32