检查JTA事务是否成功提交

时间:2015-09-22 18:16:07

标签: java-ee jpa ejb eclipselink entitylisteners

有没有办法在JPA实体监听器中检查当前事务是否已提交,如下所示?

@ApplicationScoped
public class EntityListener {

    @Inject
    private Event<EntityEvent> event;
    @Inject
    private EntityManager entityManager;
    @Resource
    private UserTransaction userTransaction;

    @PostPersist
    @PostUpdate
    @PostRemove
    public void onChange(Entity entity) {

        // This is only a piece of pseudo code.
        if (userTransaction.isComitted()) {
            // Do something.
        }
    }
}

JPA 2.1中的实体侦听器被视为依赖于CDI注入的CDI bean,并且实体侦听器中提供了CDI和事务上下文。因此,可以在实体监听器中使用这些注入(带或不带注释@ApplicationScoped)。 JPA 2.1规范声明,

  

持久性提供程序仅需要支持CDI注入   到Java EE容器环境中的实体监听器。如果CDI是   如果未启用,则持久性提供程序不得调用实体侦听器   这取决于CDI注射。

     

从Java EE环境中调用时,回调侦听器   对于实体共享调用的企业命名上下文   组件,并且在。中调用实体回调方法   调用组件的事务和安全上下文   调用回调方法的时间。

     

例如,如果由于正常而发生事务提交   使用事务终止会话bean业务方法   属性RequiresNewPostPersistPostRemove回调   在命名上下文,事务上下文和   该组件的安全上下文。

是否存在一种方法来了解JPA实体监听器中是否成功提交了事务,以便可以相应地采取不同的操作或根本不采取任何操作?

我希望事务在提交完成后不会完全完成,因此,应该有一种方法可以看到,如果提交或不特别提交,我正在寻找一种模拟事务的方法 - 宽事件,即在事务结束时触发的事件,给出事务的状态,无论事务是已提交还是已回滚。

使用具有EclipseLink 2.6.0(JPA 2.1)的GlassFish Server 4.1 / Java EE 7。

1 个答案:

答案 0 :(得分:3)

请参阅the CDI specification docs

  

10.4.5。交易观察员方法

     

事务性观察者方法是在观察期间接收事件通知的观察者方法   在交易完成之前或之后的交易   事件被解雇了。如果事件发生时没有正在进行的事务   被解雇后,他们会与其他观察员同时收到通知。

     
      
  • 在事务完成前阶段调用完成前观察者方法。
  •   
  • 在交易完成后阶段调用完成后观察员方法。
  •   
  • 成功后观察方法在交易完成后阶段被调用,仅在交易时   成功完成。
  •   
  • 在事务完成后阶段调用失败后的观察者方法,仅在事务失败时调用。
  •   
     

枚举javax.enterprise.event.TransactionPhase标识   那种交易观察者方法:

public enum TransactionPhase {
    IN_PROGRESS,
    BEFORE_COMPLETION,
    AFTER_COMPLETION,
    AFTER_FAILURE,
    AFTER_SUCCESS
}
     

可以通过指定any来声明事务观察器方法   IN_PROGRESS的{​​{1}}以外的值:

during