【问题标题】:How do i catch exceptions from container managed transaction commit?如何从容器管理的事务提交中捕获异常?
【发布时间】:2011-04-13 04:09:38
【问题描述】:

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

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

我是否必须在我的方法中手动提交事务才能在提交时捕获异常? (EntityManager.flush() 是正确的做法吗?)如果是这样,容器管理事务的意义何在?

【问题讨论】:

    标签: java exception transactions ejb container-managed


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我通过在@AroundInvoke 拦截器中执行EntityManager.flush() 解决了它。
    • 这有时可能会奏效,但请注意隔离级别。除非您序列化所有内容,否则在 tx 提交时仍然可能会失败。
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多