Java 如何从容器管理的事务提交捕获异常?

Java 如何从容器管理的事务提交捕获异常?,java,exception,transactions,ejb,container-managed,Java,Exception,Transactions,Ejb,Container Managed,我有一个带有@WebService接口的@StatelessEJB,使用容器管理的事务,这意味着在调用方法后,如果没有引发系统异常,容器会自动提交事务 如果我尝试EntityManager.persist(…)对一个列使用具有唯一约束的相同值的两个对象,容器将在我的代码之外提交时向客户端抛出PersistenceException如何捕获此异常,以便重新显示自己的应用程序异常? 我是否必须在方法中手动提交事务,以便在提交时捕获异常?(而且EntityManager.flush()是正确的方法吗?

我有一个带有
@WebService
接口的
@Stateless
EJB,使用容器管理的事务,这意味着在调用方法后,如果没有引发系统异常,容器会自动提交事务

如果我尝试
EntityManager.persist(…)
对一个列使用具有唯一约束的相同值的两个对象,容器将在我的代码之外提交时向客户端抛出
PersistenceException
如何捕获此异常,以便重新显示自己的应用程序异常?


我是否必须在方法中手动提交事务,以便在提交时捕获异常?(而且
EntityManager.flush()
是正确的方法吗?)如果是,那么容器管理事务的意义是什么?

不幸的是,无法捕获容器管理事务失败的异常。正如您所说的,您最好的选择是使用bean管理的事务。或者,您可以使用实现相同接口的代理bean包装您的EM EJB。当您的代码不需要响应特定的提交失败时,容器管理的事务是合适的。

感谢您的回答。我通过在
@AroundInvoke
拦截器中执行
EntityManager.flush()
解决了这个问题。这有时可能会起作用,但要注意隔离级别。除非序列化所有内容,否则在tx提交时仍有可能失败。