java - EJB3 - 处理 RollBackException

标签 java transactions jakarta-ee persistence ejb-3.0

我有一个 EJB3 应用程序,其中包含一些用于访问数据库的 EJB,并通过 session Bean 作为 Web 服务公开。

现在我需要弄清楚两件事:

1) 有什么方法可以阻止 SQL 异常导致 Web 服务抛出 SOAP 错误吗?事务由容器处理,当前 sql 异常会导致抛出 RollBackException,从而导致事务回滚(期望的行为)并且 Web 服务抛出错误(不期望的行为)。

2) 我希望扩展 Web 服务,使其能够接收实体列表,并使用 session bean 来保存每个实体。但是,我希望每个实体都在自己的事务中执行,这样如果一个实体失败,其他实体就不会受到影响(并且 Web 服务不应出现故障)。

对于 (1),我 try catch RollBackException,但我假设这是在另一个线程的某个地方抛出的,因为永远不会到达 catch block 。我假设对于(2)我需要研究用户事务,但首先更喜欢容器来管理它,其次不知道如何强制使用用户事务。

谢谢。

最佳答案

不,您可以使用容器管理的事务来完成所有这些(这绝对是更好的选择,因为管理事务很痛苦)。

该解决方案的要点是创建第二个仅具有本地接口(interface)和您想要的事务语义的 EJB。然后,Web 服务直接调用的“公共(public)”ejb 通过其本地接口(interface)调用第二个 ejb 来完成实际工作。

大致如下:

public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

  public void doSomething() {
    try {
      impl.doSomething();
    } catch(TXRolledBack) {
      // handle rollback ...
    }
  }
}

我知道这看起来有点难看,但相信我,这比直接操纵交易要好得多。

关于java - EJB3 - 处理 RollBackException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673538/

相关文章:

java - 审计大型 java/j2ee web 应用程序的最佳方法是什么

java - Spring MVC @AutoWired 响应不工作

java - 在测试之间重置 JPA 生成的值

java - 通过Gson将对象转换为Json时出现OutOfMemory异常

mysql - 以相同的方法在一个事务 block 内的两个表中插入记录

java - 如何配置 JDO 事务来模拟在 App Engine Java 中创建数据库序列?

java - Controller 中的 Spring Boot 重写功能

java - 尝试跳过 Java 中 while 循环的迭代时遇到问题

php - mysqli 事务仅提交一些查询

java - 用户定义的 Eclipse 格式化程序