EJB 3事务回滚问题

时间:2016-07-29 12:08:08

标签: java hibernate ejb ejb-3.0

我有以下代码:

        @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
        public Car prepareCar(Data data) throws CarServiceException{
          Car car = null;
          try {
            car = carManagerBean.createCar(data);
            Driver driver = createDriver();
            car.setDriver(driver);
          } catch (Exception e) {
            LOGGER.error(e.getMessage, e);
            context.setRollbackOnly();
            throw new CarServiceException(e);
          }
          return car;
         }

问题是如果在try部分中出现一些问题(例如SQLServerException),则不执行catch部分并且不抛出CarServiceException。有人知道这段代码可能有什么问题吗?但无论如何,交易都会回滚。 它只有在我移动try-catch块来包装方法调用时才有效。

2 个答案:

答案 0 :(得分:1)

您希望捕获事务之外的异常。这样做:

@Stateless
public class CarServiceDelegate {

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public Car prepareCar(Data data) throws CarServiceException{
      Car car = carManagerBean.createCar(data);
      Driver driver = createDriver();
      car.setDriver(driver);
      return car;
   }
}

public class CarService {

   @EJB
   private CarServiceDelegate carServiceDelegate;

   public Car prepareCar(Data data) {
       try {
           return carServiceDelegate.prepareCar();
       } catch (Exception e) {
        // You will catch it here, when the transaction is done.
        LOGGER.error(e.getMessage, e);
        throw new CarServiceException(e);
      }
   }

}

我将向您提供有关EJb异常的哪一部分要求在事务外传播Exception的更新。在@Asynchronous调用中会发生类似的行为(抑制异常)。

答案 1 :(得分:0)

请记住,如果catch块本身抛出异常,它将不会到达重新抛出异常的段。请注意,根据文档,如果事务不再处于活动状态,setRollbackOnly()可以抛出IllegalStateException。您可能希望将catch块包装在另一个try/catch块中以发现它。