Spring 数据 JPA 审计不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为什么?
Spring Data JPA Auditing not working for the JpaRepository update method with @Modifying annotation, why?
我正在研究 Spring Data JPA 和 Postgres 示例。在这个例子中,我通过 link: https://www.baeldung.com/database-auditing-jpa and 实现了 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);
}
审计基于 JPA 生命周期事件。
只有直接操作实例的方法(persist
、merge
和remove
)才会触发此类事件。
查询、修改或其他方式的执行不会触发任何事件,因此不会导致审计发生。
有关详细信息,请参阅 JPA 规范部分 3.5.2 生命周期方法。
@Audited
注释可以应用于 Class、方法和类型。我有一个类似的问题,并尝试在 update...
方法上应用 @Audited
注释,并且能够看到 _AUD
table.
中填充的审核信息
@Audited
的定义如下:https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/envers/Audited.html
我正在研究 Spring Data JPA 和 Postgres 示例。在这个例子中,我通过 link: https://www.baeldung.com/database-auditing-jpa and 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);
}
审计基于 JPA 生命周期事件。
只有直接操作实例的方法(persist
、merge
和remove
)才会触发此类事件。
查询、修改或其他方式的执行不会触发任何事件,因此不会导致审计发生。
有关详细信息,请参阅 JPA 规范部分 3.5.2 生命周期方法。
@Audited
注释可以应用于 Class、方法和类型。我有一个类似的问题,并尝试在 update...
方法上应用 @Audited
注释,并且能够看到 _AUD
table.
中填充的审核信息
@Audited
的定义如下:https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/envers/Audited.html