JPA的批量更新会触发TransactionalEventListener吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA的批量更新会触发TransactionalEventListener吗?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

如果你的spring事务bean被正确配置为使用Hibernate的SessionFactory,那么监听器应该捕获事件。

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

可以肯定的是,如果没有事务存在,请将此标志放在@TransactionalEventListener上,如规范所示:

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

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

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

在批量更新命名查询的情况下,JPA 中不会更新版本

Spring Data JPA - 并发批量插入/更新

批量更新后的 JPA JQL 查询看到过时的值

如何在 Controller 的 java spring JPA 中进行批量更新

Spring Data JPA : 批量增删