从父类更新日期字段在 Spring Data Jpa 中不起作用
Posted
技术标签:
【中文标题】从父类更新日期字段在 Spring Data Jpa 中不起作用【英文标题】:Update of Date fields from Parent class not working in Spring Data Jpa 【发布时间】:2021-11-29 09:03:48 【问题描述】:我正在使用 Spring Boot 和 Spring Data JPA,并希望更新 JPA 更新语句中的 LastUpdatedDate
和 LastModifiedBy
字段。假设 Employee 是我的实体类,它扩展了 AbstractBaseEntity
类。
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class AbstractBaseEntity
@CreatedBy
@JsonIgnore
@Column(name = "CRTE_USER_ID")
protected String createdByUser = "TEST_USER";
@CreatedDate
@JsonIgnore
@Column(name = "CRTE_DT", updatable = false)
protected Date createdDate = new Date();
@LastModifiedBy
@JsonIgnore
@Column(name = "UPDT_USER_ID")
protected String lastUpdatedByUser = "TEST_USER";
@LastModifiedDate
@JsonIgnore
@Column(name = "UPDT_DT")
protected Date lastUpdatedOn = new Date();
@Version
@JsonIgnore
@Column(name = "VER_NUM")
protected Integer versionNumber = 1;
另一个类
public class Employee extends AbstractBaseEntity
...
...
...
以下查询未更新任何日期。我们该如何解决?
@Modifying(clearAutomatically = true)
@Transactional
@Query("UPDATE Employee p SET p.status =:status, p.lastUpdatedOn = :lastUpdatedOn WHERE p.srcProjectKeyId = (:id)")
int updatestatus(@Param("status") String status, @Param("id") Long id, @Param("lastUpdatedOn") Date lastUpdatedOn);
【问题讨论】:
【参考方案1】:为了make auditing work at all,请确保@EnableJpaAuditing
注释添加到@Configuration
类。
AuditingEntityListener
方法在@PrePersist
和@PreUpdate
阶段调用。 AFAIK 仅在您直接操作实体时才有效。如果你使用@Query
语句,它不起作用。
更新语句必须手动执行,例如:
UPDATE Employee p SET p.status =:status, p.lastUpdatedOn =
:lastUpdatedOn, p.lastUpdatedBy = :lastUpdatedBy WHERE
p.srcProjectKeyId = (:id)
要获取当前日期,请使用:
Date now = new Date();
// or
long now = System.currentTimeMillis();
要获取当前用户(又名主体),请使用:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();
以下是关于缓存失效问题的更长讨论:
Spring Boot Data JPA - Modifying update query - Refresh persistence context
Spring Data JPA Update @Query not updating?
Clear Hibernate 2nd level cache after manually DB update
【讨论】:
再见问题。 “clearAutomatically = true”实际上应该完成这项工作。是否有可能,您有二级缓存或一些并发问题?你怎么检查,日期没有更新??? 你能在这里指导我吗 - ***.com/questions/69512728/…?以上是关于从父类更新日期字段在 Spring Data Jpa 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
具有多个字段和日期的 Spring Data Paging and Sorting Repository
Spring Data / Hibernate 使用 Postgres 保存实体,在冲突更新某些字段时使用插入
即使 JPA 实体不脏,我是不是可以强制 spring-data 更新可审计字段?