Java EJB3-处理回滚异常

Java EJB3-处理回滚异常,java,transactions,jakarta-ee,persistence,ejb-3.0,Java,Transactions,Jakarta Ee,Persistence,Ejb 3.0,我有一个EJB3应用程序,它由一些用于访问数据库的EJB组成,并通过会话Bean作为web服务公开 现在我需要找出两件事: 1) 有没有办法阻止SQL异常导致web服务抛出SOAP错误?事务由容器处理,当前sql异常导致抛出回滚异常,因此事务将被回滚(期望的行为),web服务将抛出错误(不期望) 2) 我希望扩展webservice,以便能够接收实体列表,并使用会话bean来持久化每个实体。但是,我希望每个实体都在自己的事务中执行,这样,如果一个实体失败,其他实体就不会受到影响(同样,web服务

我有一个EJB3应用程序,它由一些用于访问数据库的EJB组成,并通过会话Bean作为web服务公开

现在我需要找出两件事:

1) 有没有办法阻止SQL异常导致web服务抛出SOAP错误?事务由容器处理,当前sql异常导致抛出回滚异常,因此事务将被回滚(期望的行为),web服务将抛出错误(不期望)

2) 我希望扩展webservice,以便能够接收实体列表,并使用会话bean来持久化每个实体。但是,我希望每个实体都在自己的事务中执行,这样,如果一个实体失败,其他实体就不会受到影响(同样,web服务也不应该出错)

对于(1)我尝试捕获RollBackException,但我假设它被抛出到另一个线程的某个地方,因为从未到达catch块。我假设对于(2)我需要研究用户事务,但首先希望容器来管理它,其次不知道如何强制使用用户事务

谢谢。

For(1):调试代码,找出引发异常的位置和原因。然后在那里处理异常

对于(2):使用beginTransaction()和commit()包装每个实例


不,您可以使用容器管理的事务来完成所有这一切(这当然更可取,因为管理事务是一件痛苦的事情)

该解决方案的要点是创建第二个EJB,该EJB仅具有本地接口和所需的事务语义。然后,web服务直接调用的“公共”ejb通过其本地接口调用第二个ejb来执行实际工作

大致如下:

public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

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

我知道这看起来有点难看,但相信我,这比直接操作事务要好得多。

正如我所说的——异常似乎是从一个单独的线程抛出的——或者至少是在我的代码完成它所做的事情之后。具体来说,在抛出异常时,我的代码已经将控制权返回给了应用程序服务器,也就是说,不可能捕捉到它。在第二点上,我非常清楚这类问题的一般解决方案,只是不知道如何在EJB3中实现。如何使用EntityManager开始和提交事务?如何获得未绑定到容器管理事务的EntityManager?注意,私有EJB需要@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注释(否则,我们的情况与之前相同,因为事务的作用域在调用EJB上),这是有效的。谢谢
public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

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