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
相关产品推荐
相关产品推荐

