应用升级时entityManagerFactory Bean创建失败问题求助
问题:创建
entityManagerFactory Bean失败 升级应用时遇到创建名为entityManagerFactory的Bean失败问题,此前已解决「无指定名称持久化单元」的问题,但当前仍无法创建该Bean。
技术环境
- JDK 1.8
- MySQL 8.0.31
- Spring 5.3.27
- Aspectj 1.8.10
- log4j-api(core, web) 2.17.1
根错误日志
java.lang.NoSuchMethodError: org.hibernate.annotations.common.reflection.java.JavaReflectionManager.injectClassLoaderDelegate(Lorg/hibernate/annotations/common/reflection/ClassLoaderDelegate;)V
相关依赖配置
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.3.7.Final</version> </dependency> <dependency> <groupId>org.hibernate.common</groupId> <artifactId>hibernate-commons-annotations</artifactId> <version>5.1.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-search</artifactId> <version>3.4.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.3.7.Final</version> <exclusions> <exclusion> <groupId>cglib</groupId> <artifactId>cglib</artifactId> </exclusion> <exclusion> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.0.Final</version> </dependency>
applicationcontext.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"> <context:spring-configured /> <context:property-placeholder location="classpath:META-INF/demoweb-backend.properties" /> <util:properties id="demoProperties" location="file:///${catalina.home}/conf/demo.properties"/> <bean id="entityManagerFactory" class="com.demoweb.backend.util.demoLocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="demowebDataSource" /> <property name="persistenceUnitName" value="demoweb" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="generateDdl" value="${demoweb.database.generateddl}" /> <property name="databasePlatform" value="${demoweb.database.platform}" /> <property name="showSql" value="false" /> </bean> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" proxy-target-class="true"/> <jpa:repositories base-package="com.demoweb.backend.repository" /> </beans>
排查方向
- 修复Hibernate核心依赖版本匹配:Hibernate 5.3.x对应的
hibernate-commons-annotations正确版本是5.0.4.Final,当前使用的5.1.1.Final版本过高,存在方法不兼容问题,直接降级到匹配版本。 - 处理Hibernate Search版本冲突:
hibernate-search3.4.1.Final仅支持Hibernate 3.x,与当前Hibernate 5.3.x完全不兼容,要么升级到Hibernate Search 5.10.x系列(适配Hibernate 5.3),要么确认未使用该依赖后直接移除。 - 更新JPA API版本:当前
hibernate-jpa-2.0-api对应JPA 2.0,而Hibernate 5.3.x支持JPA 2.1,替换为javax.persistence:javax.persistence-api:2.1,或者删除该显式依赖,使用Hibernate核心依赖传递的JPA API。 - 排查依赖树中的冲突:用
mvn dependency:tree(Maven)或gradle dependencies(Gradle)命令分析依赖,检查是否有其他依赖传递引入了不同版本的hibernate-commons-annotations,找到后排除冲突版本。 - 验证自定义EntityManagerFactoryBean:临时将
demoLocalContainerEntityManagerFactoryBean替换为Spring原生的LocalContainerEntityManagerFactoryBean,如果能正常创建Bean,说明自定义类存在逻辑问题,需要排查其重写的初始化方法。
内容的提问来源于stack exchange,提问作者rob
相关产品推荐
相关产品推荐

