2013-08-21 100 views

回答

14

沒有映射結束代碼有點困難... 這是由於您正在刪除與某個集合關聯的對象而導致的。
你必須從擁有集合(S)刪除對象,之後,刪除對象

parentObject.collection.remove(objToDelete); 
session.delete(objToDelete); 
session.save(parentObject); 

但是你可以這樣使用deleteOrphan來映射集合這樣

class ParentObject { 
    @OneToMany(orphanRemoval=true) 
    private List<ChildObject> collection; 
} 

避免和代碼看起來像

parentObject.collection.remove(objToDelete); 
session.save(parentObject); 

您不需要刪除對象,因爲它在保存parentObject時被Hibernate自動刪除。

希望能幫助

+1

hibernate用戶應該使用這個方法去除孤兒@Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) – Akhilesh

5

您已刪除會話的實體(A),但它是由另一個實體引用,並anotated與級聯註解。該參考將導致實體(A)立即重新處理。由於這可能不是你想要的,所以hibernate抱怨。

解決的辦法是找到實體可以通過的所有引用(包括集合),並將它們設置爲null /從集合中刪除實體。

你可以把你的刪除邏輯放在一邊:讓參考(如果只有一個)刪除孤兒,然後在@bellabax中刪除它。

2

這個異常告訴你正在刪除的對象也被映射爲任何實體的集合,並且你的集合中的級聯id全部都是。所以,如果你想刪除的任何方式,您可以將您的級聯改變

cascade = CascadeType.DETACH 
0

如果您通過XML這樣做(而不是註解),以下是爲我工作的解決方案:

一到 - 許多社團:

  1. 從 父對象[注的所有集合中刪除的子對象的任何鏈接:如果你正在做一一對一的關聯,只是 設置父對象的子對象的引用到「空白」]
  2. 從數據庫中刪除的子對象
  3. 沖洗使用調用Session.flush()
  4. 鏈接父對象到新的子對象
  5. 保存父對象6)變更提交更改

小心:會話。因爲Hibernate需要查看更改,所以flush()非常重要,如果不能刷新會話,我會建議您在不同的事務中執行步驟(1,2),然後執行步驟(4,5, 6)在新的交易中。

相關問題