2011-06-10 218 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