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

问题描述 投票:1回答:1

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

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

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

java spring hibernate jpa orm
1个回答
1
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.