从父类更新日期字段在 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 更新语句中的 LastUpdatedDateLastModifiedBy 字段。假设 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 jpa 更新单个字段

Spring Data / Hibernate 使用 Postgres 保存实体,在冲突更新某些字段时使用插入

即使 JPA 实体不脏,我是不是可以强制 spring-data 更新可审计字段?

Spring Data Repository 使用更新的审计字段保存不返回实例

Spring Data Rest - 如何防止通过 PATCH 更新特定字段?