无状态 EJB 如何回滚 JPA 事务
How Stateless EJB rollback JPA transactions
例如:
@Stateless
public class EntityRepositry{
@Inject
EntityManager em;
public void create(Entity e){
// op1 success
// op2 failed
}
}
由于无状态 EJB 默认是事务性的,我想知道如果抛出系统异常(如 OptimisticLockedException),事务将如何回滚?如何隐式调用 em.getTransaction().rollback?
提前致谢。
EntityManager 注入了 @PeristenceContext
注释(或者您可能有 CDI 生产者?)
如果持久化单元被声明为使用 JTA 事务
<persistence-unit name="myname" transaction-type="JTA">
然后 EJB 事务绑定到 JPA 事务,反之亦然。
JPA 异常会回滚整个事务,但请记住,任何 RuntimeException 都会回滚事务,已检查的异常不会。
因此,如果您使用 JTA 事务管理,则不必手动回滚事务,只需抛出或捕获正确的异常(捕获 RuntimeException 不会阻止事务回滚,但允许您管理它)。
例如:
@Stateless
public class EntityRepositry{
@Inject
EntityManager em;
public void create(Entity e){
// op1 success
// op2 failed
}
}
由于无状态 EJB 默认是事务性的,我想知道如果抛出系统异常(如 OptimisticLockedException),事务将如何回滚?如何隐式调用 em.getTransaction().rollback?
提前致谢。
EntityManager 注入了 @PeristenceContext
注释(或者您可能有 CDI 生产者?)
如果持久化单元被声明为使用 JTA 事务
<persistence-unit name="myname" transaction-type="JTA">
然后 EJB 事务绑定到 JPA 事务,反之亦然。
JPA 异常会回滚整个事务,但请记住,任何 RuntimeException 都会回滚事务,已检查的异常不会。
因此,如果您使用 JTA 事务管理,则不必手动回滚事务,只需抛出或捕获正确的异常(捕获 RuntimeException 不会阻止事务回滚,但允许您管理它)。