引入Spring-JDBC回滚后出现EntityManagerFactory缺失错误求助
核心原因分析
entityManagerFactory 是Spring Data JPA自动配置的核心Bean,找不到它通常意味着Spring的JPA自动配置逻辑未正常触发,或数据源配置未被正确加载。
具体排查步骤
1. 核对依赖配置
确认pom.xml中仅保留JPA相关依赖,移除残留的Spring-JDBC依赖,确保核心JPA依赖存在:
<!-- 核心Spring Data JPA依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 数据库驱动(示例为MySQL,根据你的数据库替换) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
同时检查主类注解,确保没有错误排除JPA自动配置,比如@SpringBootApplication(exclude = {JpaAutoConfiguration.class})这类配置必须删除。
2. 验证数据源配置完整性
检查src/main/resources/application.properties中的配置是否完整、格式正确,以MySQL为例:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC spring.datasource.username=db_user spring.datasource.password=db_pass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA配置(必须存在,用于触发自动配置) spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
确认配置文件路径正确,未被误放到非resources目录。
3. 检查主类与自定义Bean
确保主类的@SpringBootApplication注解无错误配置,示例正确主类:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ExpensesApplication { public static void main(String[] args) { SpringApplication.run(ExpensesApplication.class, args); } }
如果之前为Spring-JDBC手动配置过DataSource或其他相关Bean,需彻底删除这些自定义配置,避免覆盖自动生成的entityManagerFactory。
4. 确认控制器依赖注入
检查CreditGroupController的构造函数注入的是JPA仓库类(而非JDBC模板类),示例正确注入:
@RestController @RequestMapping("/credit-groups") public class CreditGroupController { private final CreditGroupRepository creditGroupRepo; public CreditGroupController(CreditGroupRepository creditGroupRepo) { this.creditGroupRepo = creditGroupRepo; } // 业务方法... }
若注入的是自定义Bean,需确保该Bean依赖Spring自动配置的entityManagerFactory,而非手动创建的冲突Bean。
5. 彻底清理构建缓存
执行以下操作强制刷新:
- 运行命令:
mvn clean package -Dmaven.clean.failOnError=false - 重启IDE,执行"Invalidate Caches / Restart"(IntelliJ)或"Clean"(Eclipse)
- 确认target目录和.m2/repository下的项目依赖已完全删除后重新构建
额外调试手段
若以上步骤无效,添加日志配置查看自动配置细节:
logging.level.org.springframework.boot.autoconfigure=DEBUG logging.level.org.springframework.context.annotation=DEBUG
启动后搜索日志中的JpaAutoConfiguration关键字,确认该配置类是否被加载,以及是否有配置错误导致entityManagerFactory未生成。
内容的提问来源于stack exchange,提问作者Linus

