JPA的批量更新触发TransactionalEventListener?

时间:2017-01-09 19:30:47

标签: java spring hibernate jpa orm

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

我唯一能想到的是,当触发批量操作时,JPA的PersistenceContext被省略,而不是单个实体dml操作和查询。一切都仍然围绕着交易,所以同样应该调用监听器。

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

  

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