gpt4 book ai didi

java - JPA的批量更新触发TransactionalEventListener?

转载 作者:行者123 更新时间:2023-11-30 06:57:20 25 4
gpt4 key购买 nike

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

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

此外,我不知道 TransactionalEventListener 是否适用于 JPA 生命周期而不是 Hibernate(我实现了 ApplicationEventPublisherAware 接口(interface))。

最佳答案

如果您使用 JPA 方法进行 orm 操作,我希望您使用 EntityManager 接口(interface)。

这是一个很好的方法,因为您正在与 API 而不是实现(即 Hibernates Session 类)进行交互。EntityManager 在幕后无论如何都会调用 Session 类,并且充当装饰器,因此 Hibernate 正在完成所有工作。

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

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

为了确保万无一失,请按照规范建议将此标志放置在 @TransactionalEventListener 上,以防不存在事务:

If the event is not published within the boundaries of a managed transaction, the event is discarded unless the fallbackExecution() flag is explicitly set.

关于java - JPA的批量更新触发TransactionalEventListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com