我想在已经处于活动交易中的以下步骤
我有这个
@Stateless
public class DBWorker {
public Result doWork(boolean isPreview) {
Result result;
if(isPreview) {
em.getTransaction().begin();
}
doSomeWork();
List<SomeEntity> resultOfDoSomeWork = em.createQuery(..).getResultList();
result = copyToNonEntity(resultOfDoSomeWork);
if(isPreview)
em.getTransaction().rollback();
return result;
}
}
但是提供例外A JTA EntityManager cannot use getTransaction()
IllegalStateException:A JTA EntityManager cannot use getTransaction()
答案 0 :(得分:1)
您必须使用@TransactionAttribute
注释来注释EJB方法。
特别是,你必须做这样的事情:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void myMethod() {
// do something
}
REQUIRES_NEW
表示必须为业务方法启动新事务。
注意将方法调用到另一个EJB,因为如果从同一个EJB调用它,则不会创建新事务。
您可以回滚容器管理的事务:
@ApplicationException(rollback=true)
注释的自定义异常:setRollbackOnly
接口的EJBContext
方法:强制容器回滚事务,如果没有异常也是如此。例如:
抛出RuntimeException:
try {
// do something
} catch(SQLException e) {
throw new EJBException();
}
抛出自定义异常:
try {
// do something
} catch(SQLException e) {
throw new MyCustomException();
}
其中MyCustomException类类似于:
@ApplicationException(rollback=true)
public class MyCustomException extends Exception {
// your custom methods
}
通过调用setRollbackOnly方法:
Context.setRollbackOnly();