spring - 在同一事务中保存后更新期间不会调用 @PreUpdate

标签 spring jpa spring-data spring-data-jpa lifecycle

我正在使用 spring-data 和 spring-data-jpa。

我有一个为 @PrePersist 和 @PreUpdate 定义了 @EntityListeners 的实体。

我创建了一个实体并调用 thingService.save(thing)。 @PrePersist 监听器被调用。

在同一事务中,我调用了 thing.setBar(bar),然后调用了 thingService.save(thing) 来更新 thing。

这次没有调用 @PreUpdate 监听器。

我还没有找到任何描述此行为的文档。调用 service.save() 时,乳清不会被调用 @PreUpdate,而 service.save() 又会调用 thingRepository.save(thing)。

最佳答案

JPA Specification基本上对问题有逐字回答:

The PreUpdate and PostUpdate callbacks occur before and after the database update operations to entity data respectively. These database operations may occur at the time the entity state is updated or they may occur at the time state is flushed to the database (which may be at the end of the transaction).

Note that it is implementation-dependent as to whether PreUpdate and PostUpdate call-backs occur when an entity is persisted and subsequently modified in a single transaction or when an entity is modified and subsequently removed within a single transaction. Portable applications should not rely on such behavior.

这背后的原因是(我猜)更新可能永远不会发生。相反,持久化操作将实体放入持久化上下文中。对它的任何更改只会更改它,当它刷新到数据库时,只会执行插入。不涉及更新。

关于spring - 在同一事务中保存后更新期间不会调用 @PreUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48133253/

相关文章:

java - 从 java 应用程序 : Relaying denied 发送电子邮件时出现异常

java - Hibernate完整性约束冲突: NOT NULL check constraint: For onetoOne Mapping using spring boot crud

java - 使用 spring data 和 querydsl 查询集合

java - JPA MappedSuperClass继承策略

java - 在延迟加载列表上调用 size() 时无法延迟初始化集合

java - 扩展接口(interface)Repository并实现扩展接口(interface)时两个合格的bean出错

java - 在这种情况下,如何使 spring 在使用泛型时注入(inject)正确的 bean?

java - 如何正确执行以日期为条件的 JdbcQuery?

java - Hibernate 保存新的一对一实体映射

java - 在 JPQL 查询中使用数组