2012-06-05 152 views
1

我無法從數據庫中刪除實體。我有兩個課,其中一個是收據,另一個是服務。收據有使用JPA刪除實體

@ElementCollection 
@OneToMany(cascade={CascadeType.ALL}, orphanRemoval=true) 
public List<Serving> servings; 

而且我正在嘗試從控制器中刪除一份服務。

Serving serving = Serving.findById(servID); 
serving.delete(); 

結果是;

執行異常 的PersistenceException發生:org.hibernate.exception.ConstraintViolationException:無法執行JDBC批處理更新

+1

FK contraint以dB爲單位? – esej

+0

當然fk ... –

+0

對不起,但你能指定你的問題嗎? (我認爲如果Reciept在服務中被映射,我也會發現它很有趣,如果是這樣的話,怎麼樣?) – esej

回答

4

喜歡的東西:

Receipt receipt = serving.getReceipt(); 
receipet.setServings(receipt.getServings().remove(serving)); 

由於收據是其份量的OO所有者,從面向對象的角度收貨時服務被刪除必須知道。

也許在Receipt上爲服務或服務Id編寫查找程序。

(你肯定不份量應該知道它屬於哪個收據 - 的orphanRemoval似乎表明,服務真正屬於一個且只有一個收據)

+0

我如何獲得送達收據?我不會在收件時保留收據。 –

+0

(除非重新設計映射是一個選項,通過Reciept上的find查詢查詢(如findByServingId()),您是如何從服務開始時獲取ID的?爲什麼DB中有FK限制? – esej

+0

JPA自動將它作爲FK約束。但我找到了收到收據的方式,現在我可以刪除份量。謝謝你的幫助。 :) –

2

閱讀堆棧跟蹤的休息,你會發現,已經違反了約束的名稱。您可能有其他實體引用了您嘗試刪除的服務(即其他某行具有您嘗試刪除的服務行的外鍵)。

所以,爲了能夠刪除這個實體,你必須確保所有通過外鍵引用它的實體不再引用它。如何做到這一點取決於這些實體是哪些實體,它們與服務之間的關係是如何實現的以及您想要做什麼:只刪除關聯或刪除參考實體。

+0

我知道它是關係表中的一個froeign關鍵字,但它不是答案...我怎樣才能刪除這個實體? :) –

+0

請參閱我的編輯答案。 –