Spring Boot 3.0+Spring Data JPA按方法名生成查询启动报错但功能正常
Spring Boot 3.0.1 + Spring Data JPA 3.0.1 启动时命名查询查找日志误报问题
问题描述
使用Spring Initializr创建的Spring Boot 3.0.1 + Spring Data JPA 3.0.1项目,启动时会出现关于FristEntity.findByName命名查询的报错日志,提示事务回滚,但项目功能可正常运行;切换到Spring Boot 2.7版本则无此报错。日志核心内容为:系统尝试查找命名查询FristEntity.findByName时标记事务回滚,最终未找到该命名查询,随后正常完成Repository实例创建。
相关代码
实体类FristEntity
@Entity @Table(name = "t_frist") public class FristEntity { @Id @GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY) private Integer id; private String name; // Getters and setters.... }
Repository接口FristRepository
public interface FristRepository extends ListCrudRepository<FristEntity,Integer> { List<FristEntity> findByName(String name); }
POM.xml依赖
<!--head ignore--> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!--ignore-->
问题原因与解决办法
原因
这是Spring Data JPA 3.x版本初始化逻辑变化导致的日志误报:
- 解析Repository方法(如
findByName)时,框架会优先尝试查找对应的命名查询(实体上通过@NamedQuery定义的查询); - 查找命名查询的过程中,JPA事务管理器会标记当前事务需要回滚(该操作仅用于元数据查询,无需提交),但日志会输出这个标记动作,被误认为是报错;
- 最终框架未找到命名查询,会自动通过方法名生成动态查询,因此Repository可正常创建,功能不受影响。
解决办法
屏蔽冗余日志:在
application.properties或application.yml中调整日志级别,过滤掉该类日志:logging.level.org.springframework.orm.jpa.JpaTransactionManager=WARN调整后将不再看到事务回滚的相关日志。
无需额外修改代码:动态方法名查询已正常工作,不需要为实体添加
@NamedQuery(除非有明确的命名查询需求)。
内容的提问来源于stack exchange,提问作者acdxxx177
相关产品推荐
相关产品推荐

