当前位置: 首页 > 面试题库 >

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

葛景龙
2023-03-14
问题内容

我正在研究 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; 
}

主应用

@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生命周期事件。只有这些方法直接操纵实例(persistmergeremove)触发这样的事件。

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

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



 类似资料:
  • 为什么我需要再次使用hmap.put方法? 我的理解是这样的。 假设没有现有的键值对。所以,用 如果我在同一个实例中添加一个字符串,那么hashmap也应该自动更新,对吗?键=>列表对象。如果我添加到列表对象,那么对象引用不应该改变,对吗? 为什么我需要再次使用put方法并这样做?

  • 安全配置 其他配置文件config git项目中的这个项目 告诉我,怎么了?为什么会出错?

  • 运行spring boot应用程序时出现抛出错误 org.hibernate.tool.schema.spi.命令接受异常:通过JDBC语句执行DDL时出错 我已经研究过了,它看起来像是关于MySQL5方言的一些配置问题。 日志: 存储库界面: application.yml: pom.xml:

  • 问题内容: 我有如下代码: 但是,不是在每次调用setText时在循环的每次迭代后更新文本区域,而是仅在完成所有任务运行后才更新文本。为什么会发生这种情况,我该如何解决? 问题答案: 您可能正在使用Swing线程,该线程正在等待代码执行才能更新UI。尝试为该循环使用单独的线程。

  • 我有这样的Jpa存储库:

  • 我在我的代码中扩展了JpaRepository,我不能使用saveAll方法,即使它在CrudRepository中,它由PagingAndSortingRepository扩展,而后者又由JpaRepository扩展。 当我尝试将该方法用作<code>存储库时。saveAll(Someterable)我的IDE找不到它,如果我尝试在我的存储库接口中覆盖它,如下所示,我仍然会得到一个错误,说明该