Spring Data JPA Auditing无法用于带有@Modifying批注的JpaRepository更新方法,为什么?

时间:2019-06-30 09:21:24

标签: java postgresql spring-data-jpa auditing

我正在研究 Spring Data JPA和Postgres 示例。在此示例中,我通过以下链接实现了Auditinghttps://www.baeldung.com/database-auditing-jpaSpring Boot JPA@CreatedDate @LastModifiedDate not being populated when saving the object。审核工作非常好当我执行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);
}

2 个答案:

答案 0 :(得分:1)

审核基于JPA生命周期事件。 只有直接操纵实例(persistmergeremove)的方法才会触发此类事件。

执行查询(修改或其他方式)不会触发任何事件,因此不会导致审核发生。

有关详细信息,请参见“ JPA规范”第3.5.2节“生命周期方法”。

答案 1 :(得分:0)

@Audited批注可以应用于类,方法和类型。我遇到了类似的问题,并尝试在@Audited方法上应用update...批注,并且能够看到_AUD表中填充的审核信息。
@Audited的定义如下:https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/envers/Audited.html