在同一事务中保存后,在更新期间未调用@PreUpdate

时间:2018-01-07 00:26:01

标签: 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)来更新东西。

此时未调用@PreUpdate侦听器。

我还没找到任何描述此行为的文档。调用service.save()时调用了@PreUpdate,而调用了someRepository.save(thing)。

1 个答案:

答案 0 :(得分:1)

JPA Specification基本上有一个问题的逐字答案:

  

PreUpdate和PostUpdate回调分别在对实体数据的数据库更新操作之前和之后发生。这些数据库操作可能在实体状态更新时发生,也可能在状态刷新到数据库时发生(可能在事务结束时)。

     

请注意依赖于实现,是否 PreUpdate和 PostUpdate回调在实体持久化并随后在单个交易中修改或修改实体并随后在单个事务中删除。便携式应用程序不应该依赖这种行为。

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