我使用ManyToMany和JPA註釋,我需要你的寶貴建議。 (假定人和地址,同一地址被稱爲更多人(住在同一地址))。我必須從該地址刪除一個人。如何成功刪除/刪除ManyToMay關係中的操作?
Person p1 = new Person();
Person p2 = new Person();
Address add1 = new Address();
p1.add(add1);
p2.add(add1);
除了做
add1.add(p1) ;
add1.add(p2) ;
然後在合併或個人所得稅堅持適當的映射。
p1 - add1
p2 - add1
我只好獨自刪除P2,當我做
p2.removeAddress(add1)
removeAddress(add1) {
addColelction.remove(add1) }
會發生什麼事是由Hibernate JPA提供者又被刪除了地址和入口再次嘗試在地址實體繼續存在,並說「已刪除傳遞給實體的實體「併發生henc事務回滾。 我對問題的更正。映射爲 存在在腳本側:
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
@JoinTable(name = "XXXX", joinColumns = { @JoinColumn(name = "X1_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "X1_ID", nullable = false, updatable = false) })
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Collection<Parser> parsers;
在解析器側
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "parsers")
private Collection<Script> scripts;
保存爲
Script1 - Parser1
Script2 - Parser1
我們的數據模型中的數據對象A已經一對多到B,B具有oneTomany腳本對象。 A的 說集合了(B1,B2,......) B1具有(SCRIPT1)
B2具有(SCRIPT2)
當我們想刪除B2對象(我們做的只是EM.merge( A)),我們希望集合中的特定B2必須被刪除,並且相關的Script2必須被刪除。 Script2刪除應單獨刪除中間條目,但不應刪除解析器。 但Parser1被刪除和交易獲取回滾說''刪除實體傳遞到堅持
請分享您的想法。
可否請您修復格式? – kostja
你也可以顯示你是如何刪除p2的?從映射中,它不應該刪除地址,所以其他事情正在發生,但是請注意,你已經顯示瞭解析器實體的集合「解析器」的映射。映射到地址是不同的?請注意,您必須刪除雙向關係中的兩個參考。您可以調用p2.removeAddress(add1),但可能應該以某種方式調用add1.removePerson(p2),否則add1將繼續引用p2,您將得到一個約束錯誤,或者該對象模型將與數據庫,造成這樣的問題。 – Chris
我現在明白了。這個錯誤並不是因爲地址被刪除,而是因爲你正在調用地址。你還沒有清理地址'對被刪除的p2的引用,所以它仍然存在,你可能會級聯所有設置。這會導致持久操作級聯到已刪除的p2,從而導致錯誤。您必須保持雙向關係的雙方以防止此問題。從地址'個人收藏中刪除p2。 – Chris