代码编译报错:nativeEntityManagerFactory私有访问权限问题求助
编译错误解决:Spring 5.3.27中
nativeEntityManagerFactory私有访问问题 环境信息
- JDK 8
- Tomcat 9
- Spring 5.3.27
- 当前Hibernate依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.1.4.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.2.3.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.1-api</artifactId> <version>1.0.2.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.1.0.Final</version> <exclusions> <exclusion> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> </exclusion> </exclusions> </dependency>
问题详情
代码无法编译,错误集中在nativeEntityManagerFactory字段,涉及代码行:
this.nativeEntityManagerFactory = provider.createContainerEntityManagerFactory(this.persistenceUnitInfo, getJpaPropertyMap()); postProcessEntityManagerFactory(this.nativeEntityManagerFactory, this.persistenceUnitInfo); return this.nativeEntityManagerFactory;
Eclipse提示:
Multiple markers at this line - The field AbstractEntityManagerFactoryBean.nativeEntityManagerFactory is not visible - nativeEntityManagerFactory cannot be resolved or is not a field
编译报错:
/D:/repo_upgrade_tomcat_9/backend/src/main/java/com/backend/util/SLocalContainerEntityManagerFactoryBean.java:[232,21] nativeEntityManagerFactory has private access in org.springframework.orm.jpa.AbstractEntityManagerFactoryBean
解决方案
1. 修复私有字段直接访问问题
Spring 5.3.27中AbstractEntityManagerFactoryBean的nativeEntityManagerFactory字段已改为私有,子类不能直接访问,需改用类提供的保护方法:
将原代码修改为:
EntityManagerFactory emf = provider.createContainerEntityManagerFactory(this.persistenceUnitInfo, getJpaPropertyMap()); postProcessEntityManagerFactory(emf, this.persistenceUnitInfo); setNativeEntityManagerFactory(emf); // 使用protected方法设置实例 return getNativeEntityManagerFactory(); // 使用get方法返回实例
2. 统一Hibernate依赖版本
当前Hibernate依赖版本混乱(core4.1、entitymanager5.2等),与Spring 5.3不兼容,建议统一为兼容版本(如5.6.15.Final),修改后的Maven依赖如下:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-search-orm</artifactId> <version>5.11.12.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.6.15.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.1-api</artifactId> <version>1.0.2.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> <exclusions> <exclusion> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者rob
相关产品推荐
相关产品推荐

