【问题标题】:JPA's bulk update triggers TransactionalEventListener?JPA 的批量更新触发 TransactionalEventListener?
【发布时间】:2017-01-09 19:30:47
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以附加事务方法以及侦听器类吗?另外您使用的是哪个版本的 Spring?

标签: java spring hibernate jpa orm


【解决方案1】:

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

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

如果您的 spring 事务 bean 被正确配置为与 Hibernate 的 SessionFactory 一起工作,那么侦听器应该正在捕获事件。

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

为了确定起见,按照规范建议将此标志放在@TransactionalEventListener 上,以防不存在事务:

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

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 2015-04-04
    • 1970-01-01
    • 2016-07-21
    • 2013-07-11
    • 2011-11-13
    • 2021-08-13
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多