有没有办法检查当前事务是否在 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
, the PostPersist
and PostRemove
回调
在命名上下文、事务上下文和
该组件的安全上下文。
是否存在一种方法可以知道事务是否在 JPA 实体侦听器中成功提交,以便可以相应地采取不同的操作或根本不采取任何操作?
我预计事务不会在提交发生后立即完全完成,因此,应该存在一种方法来查看提交是否发生,特别是,我正在寻找一种模拟事务范围事件的方法,即在事务结束时触发的事件,给出事务的状态,无论事务是提交还是回滚。
使用具有 EclipseLink 2.6.0 (JPA 2.1) 的 GlassFish Server 4.1 / Java EE 7。
请参考CDI 规范文档 https://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#transactional_observer_methods.
10.4.5。事务观察者方法
事务观察者方法是在期间接收事件通知的观察者方法
交易完成之前或之后的阶段,其中
事件被解雇。如果事件发生时没有交易正在进行
被解雇后,他们会与其他观察员同时收到通知。
- 在事务的完成之前阶段调用完成之前观察者方法。
- 在事务的完成后阶段调用完成后观察者方法。
- 仅当事务完成后阶段才会调用成功后观察者方法
成功完成。
- 仅当事务失败时,才会在事务完成后阶段调用失败后观察者方法。
枚举javax.enterprise.event.TransactionPhase
识别
事务观察者方法的种类:
public enum TransactionPhase {
IN_PROGRESS,
BEFORE_COMPLETION,
AFTER_COMPLETION,
AFTER_FAILURE,
AFTER_SUCCESS
}
事务观察者方法可以通过指定任何
值以外的值IN_PROGRESS
for during
:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)