JPA 的批量更新触发 TransactionalEventListener?

Posted

技术标签:

【中文标题】JPA 的批量更新触发 TransactionalEventListener?【英文标题】:JPA's bulk update triggers TransactionalEventListener? 【发布时间】:2017-01-09 19:30:47 【问题描述】:

我有一个使用 Hibernate 的项目。持久化包中映射的所有对象(带有注解)都会在事务方法结束时自动更新(如果已修改)。

我想使用 JPA 2.1 中的 CriteraUpdate 执行批量更新,但我需要更改对象以从 Spring 中触发 TransactionalEventListeners。 如果我更改了对象,并且不调用任何保存方法,即使我使用了 JPA,hibernate 也会保留每个对象?

另外,我不知道TransactionalEventListener 是否适用于 JPA 生命周期而不是 Hibernate(我实现了 ApplicationEventPublisherAware 接口)。

【问题讨论】:

您可以附加事务方法以及侦听器类吗?另外您使用的是哪个版本的 Spring? 【参考方案1】:

如果您使用 JPA 方法进行 orm 操作,我希望您使用的是 EntityManager 接口。

这是一个很好的方法,因为您正在与 API 而不是实现(作为 Hibernates Session 类)进行交互。 在幕后,EntityManager 无论如何都在调用 Session 类并且就像一个装饰器一样,所以 Hibernate 正在做所有的工作。

如果您的 spring 事务 bean 被正确配置为与 Hibernate 的 SessionFactory 一起工作,那么侦听器应该正在捕获事件。

我唯一能想到的是,在触发批量操作时,JPA 的 PersistenceContext 被省略了,而不是单个实体 dml 操作和查询。一切仍然围绕事务进行,因此,应该再次调用侦听器。

为了确定起见,按照规范建议将此标志放在@TransactionalEventListener 上,以防不存在事务:

如果事件未在托管事务的边界内发布,则丢弃该事件,除非明确设置了 fallbackExecution() 标志。

【讨论】:

以上是关于JPA 的批量更新触发 TransactionalEventListener?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Spring Data JPA 更新实体时@Transactional 隔离级别不起作用?

Spring Data JPA @Modifying 注解使用@Transactional

JPA中自定义的插入更新删除方法为什么要添加@Modifying注解和@Transactional注解?

JPA - 批量/批量更新 - 更好的方法是啥?

您如何处理 Spring Data JPA 中 ID 数组的批量删除?

Spring跨越方法的JPA事务