当前位置: 首页 > 知识库问答 >
问题:

更新Spring Data Jpa中不工作的父类中的日期字段

雷硕
2023-03-14

我使用Spring Boot和Spring Data JPA,想要更新JPA更新语句中的LastUpdatedDateLastModifiedBy字段。假设雇员是我的实体类,它扩展了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个答案

牟黎昕
2023-03-14

为了使审计工作在所有,请确保@EnableJpaAudting注释添加到@Configuration类。

@PrePersist@PreUpdate阶段调用AuditingEntityListener方法。只有直接操纵实体时,AFAIK才有效。如果使用@Query语句,它就不起作用。

Update语句必须手动执行,例如:

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-修改更新查询-刷新持久性上下文

Spring Data JPA Update@查询未更新?

手动更新数据库后清除Hibernate二级缓存

 类似资料:
  • 我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下

  • 我有一个Calendarview和一个EditText。我希望以DD/MM/YYYY格式在edittext中输入的日期,并将其设置在CalendarView上。视图应将当前日期气泡更新为设置的日期。 提前道谢!

  • 我有以下代码: 在日志中,我只能看到来自BClass而不是AClass的字段: 17:52:28.151[main]INFO Main-Main. BClass(金额=12) 但是我想查看所有BClass字段,包括父类中的字段(标题字段)。我该怎么做?

  • 我正在使用MySql工作台执行查询。 但它没有更新行,并显示以下错误: 您正在使用安全更新模式,并且试图更新一个没有使用键列禁用安全模式的WHERE的表,请在Preferences->SQL Editor中切换该选项并重新连接。

  • 当更新旧日期到新日期时,我得到 SQL错误:ORA-00932:不一致的数据类型:预期日期获取字符00932。00000-“不一致的数据类型:预期%s得到%s”

  • 问题内容: 这比看起来难。我需要一个函数来计算日期范围内给定工作日的数量。我不需要任何循环或递归SQL。数以百万计的示例就是这样做的。我需要一个快速函数来进行计算。 该函数的输入将是工作日,fromdata,迄今为止 预期结果: 问题答案: @Mikael Eriksson有一个绝妙的主意,但是他的实现似乎有些复杂。 这是我想出的(我想强调一下, 它基于 @Mikael 的 解决方案 ,主要功劳应