Spring 6迁移时将Hibernate SessionFactory替换为JPA EntityManagerFactory的Bean创建失败问题
看起来你在把项目从Spring 5+Hibernate 5迁移到Spring 6+Hibernate 6的过程中,卡在了JPA风格的EntityManagerFactory创建上,我来帮你梳理下几个大概率的问题点:
一、先抓最明显的XML配置语法错误
看你贴的applicationContext.xml里的jpaProperties配置,hibernate.dialect这行明显写错了:
<entry key="hibernate.dialect"org.hibernate.dialect.PostgreSQLDialect" />
这里缺少了value=属性,正确的写法应该是:
<entry key="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
这种XML语法错误会直接导致Spring解析配置文件失败,进而触发BeanCreationException,这很可能是当前问题的直接诱因,先把这个改了再说。
二、POM依赖的兼容性问题
- Jakarta EE版本太激进
你用的是jakarta.jakartaee-api:11.0.0-M5,这是Jakarta EE 11的里程碑预览版,本身就不稳定,而且Spring 6.x对应的是Jakarta EE 10的稳定版,建议换成稳定版本:
<dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>10.0.0</version> <scope>compile</scope> </dependency>
- 缺失JCache依赖
你配置了hibernate.cache.region.factory_class为JCacheRegionFactory,但POM里没加Hibernate的JCache扩展依赖,这会导致缓存初始化失败,需要补上:
<dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-jcache</artifactId> <version>6.2.36.Final</version> </dependency>
- 确保所有javax依赖全替换为jakarta
检查项目中所有依赖,比如如果有Spring Data JPA、Jackson等,必须是支持Jakarta的版本,绝对不能留任何javax.*的依赖,否则会出现类冲突。
三、Hibernate 6的配置属性变更
Hibernate 6对很多旧配置属性做了废弃或重命名,你当前的配置里就有两个问题:
- 拦截器配置属性过时
你用的hibernate.ejb.interceptor是Hibernate 5及更早的属性,Hibernate 6里已经被移除,要换成新的属性名:
<entry key="hibernate.session_factory.interceptor" value-ref="auditLog"/>
同时要确保你的auditLog拦截器是基于Jakarta/Hibernate 6的API实现的(比如继承org.hibernate.Interceptor),而不是旧的javax版本的拦截器。
- 多租户配置的适配
你提到项目使用了多租户,但当前配置里完全没体现相关属性。在JPA风格的Hibernate 6配置中,多租户需要明确指定以下核心属性(以数据库隔离为例):
<entry key="hibernate.multi_tenant" value="DATABASE"/> <entry key="hibernate.tenant_identifier_resolver" value-ref="yourTenantResolver"/> <entry key="hibernate.multi_tenant_connection_provider" value-ref="yourConnectionProvider"/>
注意这里的yourTenantResolver要实现Hibernate 6的org.hibernate.context.spi.CurrentTenantIdentifierResolver,yourConnectionProvider要实现org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider,而且类必须是Jakarta版本的,不能用旧的javax包下的实现。
四、其他需要检查的点
- 所有实体类的注解必须从
javax.persistence.*替换为jakarta.persistence.*(比如@Entity、@Id、@Column等),这是Spring 6+Hibernate 6的硬性要求。 - 如果你之前用的是Hibernate的SessionFactory原生API,现在切换到JPA的EntityManager,要确保代码中所有Session相关的操作都换成EntityManager的方式(或者通过EntityManager获取Hibernate Session)。
先把上面这些问题逐个排查修复,尤其是XML语法错误和依赖问题,应该能解决当前的EntityManagerFactory创建失败的问题。
内容来源于stack exchange

