Spring Data JPA审计在带有@Modifying注解的JpaRepository更新方法中无法正常工作,为什么?

9

我正在开发一个关于Spring Data JPA和Postgres的示例。在这个示例中,我按照以下链接https://www.baeldung.com/database-auditing-jpaSpring Boot JPA@CreatedDate @LastModifiedDate not being populated when saving the object实现了Auditing。当我执行 repository.save 时,审计工作得非常好,在这种情况下,用@CreatedDate@LastModifiedDate注释的两个字段都正确保存。

但是,当我尝试更新这个方法时,情况就不一样了。

我编写了以下方法:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@Entity
@Table(uniqueConstraints = {
        @UniqueConstraint(name="student_name_key",columnNames = {"studentName"})
})
public class Student {
    ....
    ....
    @Column(name="lastUpdateUser")
    private String lastUpdateUser;

    @LastModifiedDate
    @Column(name="lastUpdateDate", nullable = false)
    private LocalDateTime lastUpdateDate; 
}

Main.App

@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {"com.xxx.xxx.repository"})
@ComponentScan(basePackages = {"com.xxx.yyy","com.xxx.xxx.studentportfolio"})
@EnableCaching
@EnableAsync
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class, SecurityAutoConfiguration.class})
public class MainApplication extends SpringBootServletInitializer implements CommandLineRunner{

    public static void main(String[] args) {
        SpringApplication.run(ProgramApplication.class, args);
    }
}

StudentRepository.java

public interface StusentRepository extenss JpaRepository<Stusent, Long>{

    @Mosifying(clearAutomatically = true)
    @Query("UPDATE Stusent s SET s.studentDescription=:stuDesc, s.studentId=:studentId, s.sivisionCode=:cd, "
            + "s.status=:status WHERE s.studentName=:stuName")
    vois upsateStudent(@Param("stuName") String studentName,
                        @Param("stuDesc") String studentDescription,
                        @Param("studentId") String studentId,
                        @Param("cd") String cd,
                        @Param("status") String status);
}
3个回答

7
审计基于JPA生命周期事件。 只有直接操纵实例的方法(persist, mergeremove)才会触发这些事件。 执行查询、修改或其他操作都不会触发任何事件,因此不会导致审计发生。 详见JPA规范第3.5.2节“生命周期方法”。

1
那么无法将 JPQ 查询结果持久化到审计文件中吗? - Satish Patro

1

0
你可以使用@PostLoad注解手动清理修改过的字段,然后jpaRepository将会更新这些列(在我的spring data 3.10版本中有效)。
将以下方法添加到你的审计实体或抽象基本审计实体中:
    @PostLoad
    public void prepareModifiedFields() {
        this.modifiedBy = null;
        this.modifiedDate = null;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接