如何从容器管理的事务提交中捕获exception?

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

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

我是否必须在我的方法中手动提交事务以捕获提交中的exception? (并且EntityManager.flush()是正确的方法吗?)如果是这样,那么容器管理事务的重点是什么?

遗憾的是,不可能从容器管理的事务失败中捕获exception。 如您所述,您最好的选择是使用bean管理的事务。 或者,您可以使用实现相同接口的代理bean来包装EM EJB。 当您的代码不需要响应特定的提交失败时,容器管理的事务是适当的。