You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:26:10