【问题标题】:Transaction management with JPA: how to perform a rollback if an error occurs at runtime使用 JPA 进行事务管理:如果在运行时发生错误,如何执行回滚
【发布时间】:2014-12-08 22:27:16
【问题描述】:

假设我有一个 DAO 定义如下:

@Local(MyEntityDAO.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Stateless
public class MyEntityDAO {

    public MyEntity create(MyEntity entity) {
        entityManager.persist(entity);
        return entity;
    }

    // Etc. [...]

}

所有方法都会抛出 JPA 标准异常。 现在,我想设置数据事务,以便在运行时发生回滚时管理回滚。

我发现的第一种方法是将UserTransaction 与 DAO 实例一起注入,如下所示:

@ManagedBean    
class myBean() {

    @Inject myEntityDAO myEntityDAO;
    @Resource UserTransaction userTransaction;

    void doSomething() {
        try {
            // userTransaction.begin();
            MyEntity myEntity = new MyEntity("sample-data");
            myEntityDAO.create(myEntity);
            userTransaction.commit();
        } catch (Exception ex) {
            userTransaction.rollback();
            throw ex;
        }
    }

}
  1. 上面的解决方案对吗?
  2. 是否可以仅通过注释 EJB 并使用上述 JPA 标准异常来自动管理事务?

【问题讨论】:

    标签: java hibernate jakarta-ee jpa ejb


    【解决方案1】:

    您的解决方案比它需要的复杂得多。

    从 EJB 方法调用引发的任何运行时异常都会自动导致事务回滚。你只需要:

    @Stateless
    public class MyEntityDAO {
    
        public MyEntity create(MyEntity entity) {
            entityManager.persist(entity);
            return entity;
        }
    
        // Etc. [...]
    
    }
    

    @ManagedBean    
    class myBean() {
    
        @Inject MyEntityDAO myEntityDAO;
    
        void doSomething() {
            MyEntity myEntity = new MyEntity("sample-data");
            myEntityDAO.create(myEntity);
        }
    
    }
    

    您只需要确保每个需要原子的操作都在 DAO 中实现。

    任何抛出的 JPA 异常都将包装在 javax.ejb.EJBException 中,您需要以某种方式在 UI 中处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 2017-08-19
      相关资源
      最近更新 更多