Java11迁Java21后SpringBoot缺失entityManagerFactory Bean问题排查
1. 确认JPA Starter依赖配置
Spring Boot 3.x 对JPA依赖做了版本适配,确保build.gradle中引入的是官方starter,而非零散的Hibernate依赖:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
禁止同时手动引入hibernate-core、hibernate-entitymanager这类依赖,starter已包含适配当前Spring Boot版本的Hibernate包,手动添加极易引发版本冲突。
2. 检查JPA自动配置是否被禁用
排查项目主启动类是否有@SpringBootApplication(exclude = {JpaAutoConfiguration.class})注解,或配置文件中存在spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.JpaAutoConfiguration配置。如有,立即移除,Spring Boot需通过自动配置创建entityManagerFactory。
3. 验证实体类扫描范围
Spring Boot 3.x 默认扫描主启动类所在包及其子包下的实体类。若实体类在其他路径,需通过@EntityScan指定扫描路径:
@SpringBootApplication @EntityScan(basePackages = "com.yourproject.entity") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
4. 分析Gradle依赖树定位冲突
执行gradle dependencies生成依赖树,重点排查:
- 是否存在多版本
hibernate-core/hibernate-entitymanager,若有,通过exclude排除旧版本:implementation('第三方依赖坐标') { exclude group: 'org.hibernate', module: 'hibernate-core' } - 确认
spring-orm版本是否匹配,Spring Boot 3.3.4对应spring-orm6.1.x版本,若存在低版本spring-orm依赖,强制升级或排除。
5. 检查数据源配置有效性
确保application.properties/application.yml中数据源配置完整且正确,Spring Boot需有效数据源才能初始化entityManagerFactory:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db spring.datasource.username=db_user spring.datasource.password=db_pass spring.jpa.hibernate.ddl-auto=update
若使用自定义数据源Bean,需确保Bean已正确注册,且JPA配置指向该数据源。
6. 排查自定义JPA配置类
若项目有自定义LocalContainerEntityManagerFactoryBean配置,检查:
- 配置类是否标记
@Configuration注解 - 是否正确设置
packagesToScan和dataSource属性 - Bean名称是否为
entityManagerFactory(Spring Boot默认依赖此名称的Bean)
若自定义Bean,可添加@Primary注解确保其被优先加载,避免自动配置Bean被覆盖后未正确创建。
内容的提问来源于stack exchange,提问作者VoodooJellyfish

