2016-01-17 40 views
2

存在實體A引用(多對一)實體B,從B到A的反向(映射)引用。還有參考A到C和反向參考C到A. 當我發出entityManager.remove(A),然後flush(),「刪除」不gerenated!但也沒有例外。就像沒有調用remove()一樣。爲什麼會發生? 如果在刪除()之前,我們從反向引用B.listOfA和C.listOfA中提取A,則按預期生成「delete」。靜默地忽略remove()

另請注意my another question在那裏我得出的結論是孤兒刪除並不總是按預期工作。現在我開始懷疑,也許級聯效果很好,但在此之後,實際的級聯拆除就像我在這裏描述的那樣「吞食」了。

+0

發佈實體映射以及刪除邏輯將有所幫助。您可能需要檢查您是否正在實體管理器上啓動並提交事務。 –

+1

孤兒去除應該只適用於私人擁有的實體。如果你的'孤兒'與它有其他關係,那麼這些關係就必須被清除 - JPA不會爲你做。如果這些關係中的任何一個具有級聯設置,則可能會導致此類問題。刪除其他人引用的對象而不修復這些引用會導致在處理JPA緩存時出現各種問題。 – Chris

回答

2

看看這個answer。基本上,JPA規範規定,如果對其應用持久性操作,則會再次管理已刪除的實體。

要驗證這一切真的發生,啓用org.hibernate包跟蹤日誌級別和搜索類似的日誌條目:

un-scheduling entity deletion ... 

爲了避免不可預知的行爲,建議對去除實體引用都被刪除來自加載相同會話/事務的所有其他實體實例。

+1

然後你必須說A被安排刪除,但是JPA重新考慮了,因爲我再次打電話給em.persist(A)。但我根本不打電話堅持()!我做的唯一的事情就是em.remove(A),然後是em.flush()。或者你的意思是堅持(B)並堅持(C)無論如何因爲刪除(A)以某種方式觸及B和C(即使我沒有明確修改它們)?好的,我會檢查。 –

+1

@MaksimGumerov在刷新時,持久化操作級聯到來自持久化上下文中存在的所有實體的所有關聯。 –