Spring Boot 3.2.2迁移时EntityManagerFactory与SessionFactory冲突求助
Spring Boot 3.2.2迁移中Hibernate与Spring Data JPA SchemaManager冲突解决方案
问题根源
Spring Boot 3.x全面切换到Jakarta EE规范,而适配Spring Boot 3的Hibernate 6.x中,org.hibernate.relational.SchemaManager与Jakarta EE标准的jakarta.persistence.SchemaManager存在方法签名重复(均为getSchemaManager()),但返回类型不兼容。若自定义JPA配置中指定entityManagerFactoryInterface为Hibernate的SessionFactory,Spring的EntityManagerFactoryInfo在生成代理类时会因类型冲突抛出BeanCreationException。
解决步骤
1. 修正JPA配置类的entityManagerFactoryInterface属性
检查自定义JPA配置(如DefaultJPAConfig),移除或修改引发冲突的配置项:
- 错误示例:
@Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setEntityManagerFactoryInterface(SessionFactory.class); // 引发冲突的配置 // 其他配置项 return em; }
- 修正后:
@Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); // 方案1:移除该配置,让Spring Boot自动使用Jakarta规范的接口 // 方案2:明确指定Jakarta的EntityManagerFactory em.setEntityManagerFactoryInterface(jakarta.persistence.EntityManagerFactory.class); // 其他配置项 return em; }
2. 统一依赖版本,避免Hibernate版本冲突
确保pom.xml中使用Spring Boot Parent管理依赖,不要手动引入不兼容的Hibernate版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.2</version> </parent> <dependencies> <!-- 仅需引入Spring Data JPA starter,无需单独引入hibernate-core --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 其他业务依赖 --> </dependencies>
3. 全局替换Java EE包为Jakarta EE包
将代码中所有javax.persistence.*的导入替换为jakarta.persistence.*,覆盖实体类、Repository接口、配置类中的相关注解:
- 错误示例:
import javax.persistence.Entity; - 修正后:
import jakarta.persistence.Entity;
4. 检查并修正application配置文件
若application-dev.yml或application.properties中存在手动指定Hibernate实体管理器接口的配置,删除或修正:
- 错误配置(yml):
spring: jpa: properties: hibernate: entity_manager_factory_interface: org.hibernate.SessionFactory
- 修正:删除该配置项,或改为:
spring: jpa: properties: hibernate: entity_manager_factory_interface: jakarta.persistence.EntityManagerFactory
内容的提问来源于stack exchange,提问作者Majestix Finger
相关产品推荐
相关产品推荐

