2010-09-16 23 views
5

我有一個@Stateless EJB和@WebService接口,它使用容器管理的事務,這意味着如果一個方法在不引發系統異常的情況下被調用,則容器自動提交事務。如何從容器管理的事務提交中捕獲異常?

如果我嘗試EntityManager.persist(...)兩個具有相同值的對象,對於具有唯一約束的列,容器將向我的代碼外提交的客戶端拋出PersistenceException如何捕獲此異常,以便我可以重新拋出自己的應用程序異常?

我是否必須在我的方法中手動提交事務以在提交時捕獲異常? (並且EntityManager.flush()是正確的方法嗎?)如果是這樣,容器管理事務有什麼意義?

回答

3

很遺憾,無法從容器管理的事務失敗中捕獲異常。如您所述,您最好的選擇是使用bean管理的事務。或者,您可以使用實現相同接口的代理bean來包裝EM EJB。當您的代碼不需要響應特定的提交失敗時,容器管理的事務是適當的。

+2

謝謝你的回答。我通過在'@ AroundInvoke'攔截器中執行'EntityManager.flush()'來解決它。 – 2010-10-27 09:23:38

+1

這可能有時會起作用,但要小心隔離級別。除非你序列化所有的東西,否則當tx提交時仍然有可能失敗。 – 2010-10-28 20:39:45