有没有办法在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业务方法 属性
RequiresNew
,PostPersist
和PostRemove
回调 在命名上下文,事务上下文和 该组件的安全上下文。
是否存在一种方法来了解JPA实体监听器中是否成功提交了事务,以便可以相应地采取不同的操作或根本不采取任何操作?
我希望事务在提交完成后不会完全完成,因此,应该有一种方法可以看到,如果提交或不特别提交,我正在寻找一种模拟事务的方法 - 宽事件,即在事务结束时触发的事件,给出事务的状态,无论事务是已提交还是已回滚。
使用具有EclipseLink 2.6.0(JPA 2.1)的GlassFish Server 4.1 / Java EE 7。
答案 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