2010-02-01 40 views
10

我有這樣的實體:刪除的實體被persist例外

文件 | n .. 至 ..1 | DocumentType | 1 .. 至 .. n | 物業類型 | 1 .. 至 .. n | DocumentProperty

我只是試圖刪除文件,如: entityManager.remove(文件);

但錯誤在燒成:

16:45:51499 ERROR [[煤層資源的Servlet] Servlet.service()爲servlet的煤層資源的Servlet拋出異常 javax.persistence.EntityNotFoundException:刪除的實體通過堅持:[up.docstore.PropertyType#]

這個問題似乎來自這裏:

@OneToMany(mappedBy = "documentType", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 
@ForeignKey(name = "FK_DOCUMENT_TYPE__PROPERTY_TYPE") 
@Sort(type = SortType.NATURAL) 
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>(); 

如果我刪除CascadeType.PERSIST所有它的工作。 但我需要它,也需要它EAGERLY。

有誰知道其他解決方案?

編輯:刪除DELETE_ORPHAN級聯,但仍然是同樣的問題。

回答

12

解決方案:

  • 有一個@ManyToOne關係CascadeType.REMOVE!刪除它。

爲什麼選擇這種解決方案?

  • ,如果你想刪除你當然不希望刪除其母公司,因爲有可能是與該父其他孩子一個孩子。
+3

是 - 這是我們隱藏的,因爲你沒有顯示它;) – Bozho 2010-02-02 17:59:33

0

我看你在cascade設置在兩個地方:@OneToMany@Cascade。我覺得這可能是一個問題,如果一個覆蓋其他...


錯誤要報告需要一些更多的上下文可以理解的。 「刪除一個已經被刪除的實體」明確地涉及到兩個操作......你需要提供關於狀態之前,操作和狀態之後的細節(「狀態」,我的意思是數據庫中的狀態......)。

+0

嗨,我剛剛添加了DELETE_ORPHAN級聯,只是爲了克服一個解決方案,但似乎不是問題。無論如何,我通過DELETE做一個簡單的休息調用,發送一個將被刪除的文檔ID,所以......一個非常簡單的場景。 – 2010-02-01 17:01:00

+0

根據hibernate docs(懶得現在看它)'@ Cascade' _adds_到JPA'cascade'屬性,並不會覆蓋它。 – Bozho 2010-02-02 09:22:32

+0

@Bozho感謝這個精度,理論上;-)。我希望有人在實踐中測試這個,也許克里斯蒂安? :-) – KLE 2010-02-02 14:47:27

0

看起來像Cascade選項是讓實體管理器認爲當調用em.remove(document)時,該對象或鏈中的某個其他對象需要被持久化。需要更多具體信息...

6

我假設你在PropertyType之前曾撥打remove()。呼叫remove()只對「根」的實體,並且用類似刪除他人:

​​

並保留DELETE_ORPHAN

可以然後,覈實後你有沒有手動的另一種叫remove()實體,嘗試調用:

document = entityManager.merge(document); 
entityManager.remove(document); 

使得EntityManager第一重新關聯與會話對象。

+0

嗨Bozho。我打電話給文件刪除,我期待其他實體將通過級聯刪除。調用document.getDocumentType()。getPropertyTypes()。remove(propertyType);我需要做一個foreach屬性設置,當我刪除一個,異常被解僱,因爲屬性類型的數量不會保持不變... – 2010-02-02 07:17:56

+0

tripple檢查你是否調用刪除某處;)然後看到我的更新 – Bozho 2010-02-02 07:31:58

相關問題