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

Spring Boot中EntityManagerFactory与EntityManagerFactoryInfo冲突问题求助

问题:Spring Boot 3.2.3 启动时抛出BeanCreationException(EntityManagerFactory接口冲突)

启动应用时触发BeanCreationException,错误提示:

EntityManagerFactory接口[org.hibernate.SessionFactory]与Spring的EntityManagerFactoryInfo混入类冲突,建议将'entityManagerFactoryInterface'属性重置为[jakarta.persistence.EntityManagerFactory]

之前使用旧版Spring Boot + javax依赖时运行正常,升级到Spring Boot 3.2.3并替换为jakarta依赖后出现该问题,排查版本兼容及配置问题。


pom.xml依赖配置

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.3</version>
        <relativePath/> 
  <dependency>
            <groupId>jakarta.persistence</groupId>
            <artifactId>jakarta.persistence-api</artifactId>
            <version>3.2.0-M1</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
            <version>2.1.2</version>
        </dependency>
    </parent>

DatabaseConfiguration类代码

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "dbEntityManagerFactory", transactionManagerRef = "dbTransactionManager", basePackages = {
    "..."})
@EntityScan("...")
@RequiredArgsConstructor
public class DatabaseConfiguration {

    private final YamlProperties yamlProperties;

    @Bean(name = "dbDataSourceProperties")
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties dbDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "dbDataSource")
    public DataSource dataSource(@Qualifier("dbDataSourceProperties") DataSourceProperties dbDataSourceProperties) {
        return dbDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean(name = "dbEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        @Qualifier("dbDataSource") DataSource dbDataSource) {

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dbDataSource);
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        properties.setProperty("hibernate.connection.url", getDatabaseUrl());
        properties.setProperty("hibernate.default_schema", "CCN2_SCHEMA");
        em.setJpaProperties(properties);
        em.setPackagesToScan("eu.europa.ec.taxud.ssv.earchiving_archiving_agent_kibana_pdf_recovery.repository.model");
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        em.setPersistenceUnitName("dbDataSource");

        return em;
    }

    @Bean(name = "dbTransactionManager")
    public PlatformTransactionManager dbTransactionManager(
        @Qualifier("dbEntityManagerFactory") EntityManagerFactory dbEntityManagerFactory) {
        return new JpaTransactionManager(dbEntityManagerFactory);
    }

    public String getDatabaseUrl() {
        return String.format(
            "%s;USER=%s;PASSWORD=%s;DATABASE_TO_LOWER=true;INIT=CREATE SCHEMA IF NOT EXISTS CCN2_SCHEMA;",
            yamlProperties.getAppProperties().getDatabaseProperties().getSpringDatasourceUrl(),
            yamlProperties.getAppProperties().getDatabaseProperties().getSpringDatasourceUsername(),
            yamlProperties.getAppProperties().getDatabaseProperties().getSpringDatasourcePassword());
    }
}

解决方案

1. 修复依赖版本兼容性

Spring Boot 3.x完全基于Jakarta EE规范,禁止混合javax和jakarta依赖,同时不要手动指定与Spring Boot parent管理冲突的依赖版本:

  • 移除手动指定的jakarta.persistence-api依赖,Spring Boot parent已内置兼容版本(3.2.3对应Jakarta Persistence API 3.1.0),预览版3.2.0-M1存在兼容性问题
  • 将javax.annotation-api替换为jakarta.annotation-api,由parent管理版本
  • 添加spring-boot-starter-data-jpa依赖,提供JPA自动配置及完整依赖链

修改后的核心依赖片段:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
    <relativePath/> 
</parent>

<dependencies>
    <!-- 替换javax注解为Jakarta版本 -->
    <dependency>
        <groupId>jakarta.annotation</groupId>
        <artifactId>jakarta.annotation-api</artifactId>
    </dependency>
    
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
    </dependency>
    <dependency>
        <groupId>jakarta.activation</groupId>
        <artifactId>jakarta.activation-api</artifactId>
    </dependency>
    
    <!-- 必须添加的JPA starter依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

2. 修正EntityManagerFactory配置

显式指定entityManagerFactoryInterface为jakarta.persistence.EntityManagerFactory,解决接口冲突;同时移除重复的连接URL配置:

@Bean(name = "dbEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    @Qualifier("dbDataSource") DataSource dbDataSource) {

    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dbDataSource);
    // 显式指定Jakarta规范的EntityManagerFactory接口
    em.setEntityManagerFactoryInterface(jakarta.persistence.EntityManagerFactory.class);
    
    Properties properties = new Properties();
    properties.setProperty("hibernate.hbm2ddl.auto", "update");
    properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
    // 移除重复的url配置,DataSource已包含连接信息
    // properties.setProperty("hibernate.connection.url", getDatabaseUrl());
    properties.setProperty("hibernate.default_schema", "CCN2_SCHEMA");
    
    em.setJpaProperties(properties);
    em.setPackagesToScan("eu.europa.ec.taxud.ssv.earchiving_archiving_agent_kibana_pdf_recovery.repository.model");
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    em.setPersistenceUnitName("dbDataSource");

    return em;
}

3. 检查实体类注解

确保所有实体类使用jakarta.persistence.*下的注解(如@Entity、@Id、@Column等),替换旧的javax.persistence.*注解。


内容的提问来源于stack exchange,提问作者Kamalama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:54:52