EJB3 - 处理RollBackExceptions

时间:2009-03-23 14:17:24

标签: java transactions java-ee persistence ejb-3.0

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

现在我需要找到两件事:

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

2)我希望扩展webservice以获取实体列表,并且会话bean可以保留每个实体。但是,我希望每个实体都在自己的事务中执行,这样如果一个实体失败,其他实体就不会受到影响(并且Web服务也不会出错)。

对于(1)我试图捕获RollBackException,但我认为这是在另一个线程上抛出的,因为永远不会到达catch块。我假设(2)我将需要查看用户事务,但首先更喜欢容器来管理它,其次不知道如何强制使用用户事务。

感谢。

2 个答案:

答案 0 :(得分:2)

不,你可以用容器管理的交易完成所有这些(这绝对是可取的,因为管理交易很麻烦)。

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

类似于:

public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

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

我知道这看起来很丑陋,但相信我,这比直接操纵交易要好得多。

答案 1 :(得分:0)

对于(1):调试代码以找出抛出异常的位置以及导致异常的原因。然后在那里处理异常。

For(2):用beginTransaction()和commit()包装每个实例。

for(each Entity){
    try{
        //begin transaction
        //save entity
        //commit
    } catch(Exception e) {
         //handle Exception, but continue on
    }
}