我有一个使用Hibernate的项目。持久化包中映射的所有对象(带注释)将在事务方法结束时自动更新(如果已修改)。
我想从JPA 2.1中使用CriteraUpdate
执行批量更新,但我需要更改对象以从Spring触发TransactionalEventListeners
。
如果我更改了对象,并且没有调用任何保存方法,那么即使我使用了JPA,hibernate也会保留每个对象?
另外,我不知道TransactionalEventListener
是否可以使用JPA生命周期而不是Hibernate(我实现ApplicationEventPublisherAware
接口)。
答案 0 :(得分:1)
如果您正在使用JPA方法进行orm操作,我希望您使用的是EntityManager接口。
这是一个很好的方法,因为您正在与API交互而不是实现(作为Hibernates Session类)。 在幕后,EntityManager无论如何都在调用Session类,就像装饰器一样,所以Hibernate正在做所有的工作。
如果你的spring事务bean被正确配置为使用Hibernate的SessionFactory,那么监听器应该捕获事件。
我唯一能想到的是,当触发批量操作时,JPA的PersistenceContext被省略,而不是单个实体dml操作和查询。一切都仍然围绕着交易,所以同样应该调用监听器。
可以肯定的是,如果没有事务存在,请将此标志放在@TransactionalEventListener上,如规范所示:
如果事件未在托管事务的边界内发布,则除非显式设置fallbackExecution()标志,否则将丢弃该事件。