SpringBoot启动提示找不到entityManagerFactory Bean如何解决
问题根因
报错核心原因是Maven依赖配置错误:你没有引入Spring Boot官方的JPA场景启动器,只引了Spring Data JPA的裸核心包和JPA规范接口包,缺失了JPA默认实现Hibernate、Spring Boot JPA自动装配的相关逻辑,Spring容器根本没法自动构建entityManagerFactory这个核心Bean。
修复步骤
- 替换错误的JPA相关依赖
你当前pom里的spring-data-jpa只是Spring Data JPA的核心API包,既不带Spring Boot自动配置逻辑,也不包含JPA的具体实现;单独引入的javax.persistence-api只是一套接口,没有运行时的实现类,完全跑不起来JPA。
直接删除pom.xml中以下两个依赖:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version> </dependency>
替换为和你当前Spring Boot版本(2.7.1)匹配的官方JPA启动器:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.7.1</version> </dependency>
这个启动器会自动帮你引入所有JPA运行需要的依赖:匹配版本的spring-data-jpa、Hibernate核心实现、JPA自动配置类、对应版本的persistence API包,不需要你手动维护这些依赖的版本适配。
- 修正多余/缺失的扫描配置
- 你的
UserRepository接口上不需要加@Repository注解:只要接口继承了Spring Data的Repository基类接口(CrudRepository/JpaRepository等),被Spring扫描到就会自动注册为Bean,加这个注解属于冗余配置。 - 如果你的实体类、Repository接口不在主启动类
RunApp所在包的子路径下,不要只加@EnableJpaRepositories,还要补充@EntityScan注解指定实体类的扫描路径,示例:
- 你的
@SpringBootApplication // 指定Repository接口所在的包路径 @EnableJpaRepositories(basePackages = "com.example.demo.repo") // 指定@Entity注解标注的实体类所在的包路径 @EntityScan(basePackages = "com.example.demo.entity") public class RunApp { public static void main(String[] args) { SpringApplication.run(RunApp.class, args); } }
如果你的实体、Repository都在主启动类的同包/子包下,连@EnableJpaRepositories都不需要手动加,Spring Boot的自动配置会默认扫描这些路径。
- 刷新依赖后重启验证
改完pom后先执行Maven的clean、install命令拉取正确的依赖,确认本地MySQL服务正常启动、jdbc:mysql://localhost:3306/mydbtest对应的库已经创建,再启动应用即可。
其他同类报错的排查点
如果改完依赖还是报同样的错,顺着启动日志找最底层的根异常:
- 如果是JDBC连接相关报错,检查数据源配置:账号密码是否正确、MySQL驱动版本和数据库版本是否匹配、数据库服务是否允许本地连接
- 如果你后续升级到Spring Boot 3.x版本,注意Jakarta包名切换:所有
javax.persistence包下的注解要替换为jakarta.persistence包下的对应注解,否则也会识别不到实体导致entityManagerFactory创建失败
内容的提问来源于stack exchange,提问作者user18308772
相关产品推荐
相关产品推荐

