2014-01-08 67 views
0

我使用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被刪除和交易獲取回滾說''刪除實體傳遞到堅持
請分享您的想法。

+0

可否請您修復格式? – kostja

+0

你也可以顯示你是如何刪除p2的?從映射中,它不應該刪除地址,所以其他事情正在發生,但是請注意,你已經顯示瞭解析器實體的集合「解析器」的映射。映射到地址是不同的?請注意,您必須刪除雙向關係中的兩個參考。您可以調用p2.removeAddress(add1),但可能應該以某種方式調用add1.removePerson(p2),否則add1將繼續引用p2,您將得到一個約束錯誤,或者該對象模型將與數據庫,造成這樣的問題。 – Chris

+0

我現在明白了。這個錯誤並不是因爲地址被刪除,而是因爲你正在調用地址。你還沒有清理地址'對被刪除的p2的引用,所以它仍然存在,你可能會級聯所有設置。這會導致持久操作級聯到已刪除的p2,從而導致錯誤。您必須保持雙向關係的雙方以防止此問題。從地址'個人收藏中刪除p2。 – Chris

回答

0

你提到你只想清除連接表,但你同時在腳本 - >解析器映射中設置了DELETE_ORPHAN和cascade。第一個設置似乎是一個等同於JPA孤兒刪除的休眠選項,這將導致從集合中取消引用的任何實體在數據庫中被刪除。這將導致示例中的Address1被刪除。

級聯所有選項將強制刪除操作級聯到人員/腳本調用刪除時仍由Person/Script引用的任何實體。在第一個例子中,這將導致Address2從數據庫中被刪除/刪除。

如果您想讓地址1或地址2生存下來,請刪除相應的設置。正如評論中所提到的那樣,您還需要清理您的引用,因爲倖存者將被引用已刪除的Person/Script實體,這可能會在您的應用程序中導致問題。

+0

Chris,這裏腳本或Person都具有相同的引用地址對象。但是你提到'addess 1 or address 2',你說兩個不同的地址對象? – Marie

+0

我不知道,因爲你在Person-address和parser/scripts之間的切換讓我困惑。我提到的問題仍然存在 - 您可以級聯移除您在Script-> Parser之間顯示的關係。這意味着如果你刪除一個腳本,它會導致它所引用的所有解析器也被刪除。您還設置了孤立刪除,這意味着如果您從此關係中解除引用解析器,該解析器將從數據庫中刪除。我不認爲你想要什麼。 – Chris