Почему не работает Spring Data JPA Auditing для метода обновления JpaRepository с аннотацией @Modifying, почему? - PullRequest
0 голосов
/ 30 июня 2019

Я работаю на примере 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);
}

1 Ответ

1 голос
/ 01 июля 2019

Аудит основан на событиях жизненного цикла JPA. Только методы, непосредственно управляющие экземплярами (persist, merge и remove), инициируют такие события.

Выполнение запросов, изменяющих или нет, не вызывает каких-либо событий и, следовательно, не вызовет аудит.

Подробнее см. В разделе «Спецификация JPA» 3.5.2 Методы жизненного цикла.

...