假设我的 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;
}
}
}
答案 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。