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注解?