2012-02-24 57 views
1

我正在使用Hibernate和Spring,而且我目前被一些我認爲會很容易修復的東西卡住了。我有一個類似的服務方法:Spring:在提交時捕獲ConstraintViolationException

@Transactional 
public void deleteObject(ObjectClass object) 
{ 
    this.objectClassDAO.delete(object); 
} 

我需要當用戶試圖刪除其與另一個實體的對象,以顯示一個友好的消息。我遇到的問題是,在調用commit()之前拋出ConstraintViolationException,它在我的服務方法範圍之外運行。有沒有辦法讓spring在發生特定異常時調用某些中間代碼,以便我可以設置正確的錯誤消息?

我一直在谷歌搜索了一個多小時沒有運氣。我發現的這些方法似乎至少有點相關,看起來像是矯枉過正,就像它們在應用程序級別運行一樣。在方法級提交後是否有一種簡單的方法來攔截異常?

回答

2

您可能正在使用FlushMode.AUTO,並且在事務結束時(在由Spring創建的服務周圍的代理中)拋出異常。您可以在objectClassDAO.delete()方法中明確地調用Session.flush()。您通常不希望這樣做,但在這種情況下,它將強制與基礎持久性進行同步,並且如果存在違反約束的情況,則在objectClassDAO.delete返回之前將拋出異常。但這可能是最後的選擇。

+0

謝謝,我試過這個,它工作。儘管有缺點嗎?你爲什麼會用它作爲最後的手段? – JayPea 2012-02-25 00:12:37

+0

好吧,混合自動和手動沖洗可能有點奇怪。它也可能效率較低。但是,我沒有看到這樣做的真正危險。 – 2012-02-25 00:26:21

相關問題