使用JPA进行事务管理:如果在运行时发生错误,如何执行回滚

时间:2014-10-14 07:57:17

标签: java hibernate java-ee jpa ejb

假设我的 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标准例外来自动管理事务?

1 个答案:

答案 0 :(得分:2)

你的解决方案比它需要的更复杂。

从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。