Spring Data JPA Audit не работает для метода обновления JpaRepository с аннотацией @Modifying, почему?
Я работаю на примере Spring Data JPA и Postgres. В этом примере я реализовал Auditing
по следующей ссылке: https://www.baeldung.com/database-auditing-jpa и Spring Boot JPA@CreatedDate @LastModifiedDate не заполняется при сохранении объекта. Аудит работает очень хорошо Когда я делаю 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 ответа
Аудит основан на событиях жизненного цикла JPA. Только методы, непосредственно манипулирующие экземплярами (persist
, merge
а также remove
) вызвать такие события.
Выполнение запросов, изменяющих или нет, не вызывает каких-либо событий и, следовательно, не вызовет аудит.
Подробности смотрите в разделе "Спецификация JPA" 3.5.2 Методы жизненного цикла.
@Audited
аннотация может применяться к классу, методу и типу. У меня была аналогичная проблема, и я попытался применить@Audited
аннотация на update...
метод и смог увидеть информацию аудита, заполненную в _AUD
Таблица.
Значение@Audited
выглядит следующим образом: https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/envers/Audited.html
Вы можете вручную очистить измененные поля, используя аннотацию @PostLoad, а затем jpaRepository обновит эти столбцы (у меня работает с данными Spring 3.10).
Добавьте следующий метод к проверяемым объектам или к абстрактному базовому проверяемому объекту:
@PostLoad
public void prepareModifiedFields() {
this.modifiedBy = null;
this.modifiedDate = null;
}