有这个类:
@Data
@Accessors(chain = true)
@NoArgsConstructor
@Entity
class MyEntity {
@JsonProperty(access = JsonProperty.Access.READ_WRITE)
@Id
private String id;
private String birthPlace;
@UpdateTimestamp
private LocalDateTime updatedAt;
@CreatedDate
private LocalDateTime createdAt;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
updatedAt = LocalDateTime.now();
}
@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}
}
我这样写测试:
String id = UUID.randomUUID().toString();
repository.save(new MyEntity().setId(id));
MyEntity savedEntity = repository.getOne(id);
assertNotNull(savedEntity.getCreatedAt());
assertNotNull(savedEntity.getUpdatedAt());
assertEquals(savedEntity.getCreatedAt(), savedEntity.getUpdatedAt());
Thread.sleep(100);
savedEntity = repository.save(repository.getOne(id).setBirthPlace("Moscow"));
assertNotNull(savedEntity.getCreatedAt());
assertNotNull(savedEntity.getUpdatedAt());
assertNotEquals(savedEntity.getCreatedAt(), savedEntity.getUpdatedAt());
在上面的测试repository
中,是这样的JpaRepository
。问题是钩子不起作用PrePersist
,但PreUpdate
它不起作用。不明白为什么。
如果启用 SQL 日志记录,您将看到
UPDATE
-query 未执行,因为 object 没有更改savedEntity
。因此,@PreUpdate
也不会调用 -hook。在保存更改之前,Hibernate/JPA 从数据库中获取对象的当前状态并将其与正在保存的对象进行比较。如果它们相同,则
UPDATE
-request 将失败。在调用之前
savedEntity = repository.save(repository.getOne(id));
,您需要更改对象的任何属性的值savedEntity
,然后请求将被执行并且钩子将起作用。