引入Hibernate 6.1.3.Final后无法访问EntityManager求助
问题解决:添加Hibernate 6.1.3.Final后无法访问EntityManager
问题背景
我通过以下代码获取Hibernate Session:
entityManager.unwrap(Session.class);
但添加Hibernate 6.1.3.Final核心依赖后,持续报错:
error: cannot access EntityManager
我的Service类结构如下:
@Service @AllArgsConstructor @Log4j2 @Transactional(readOnly = true) public class ExternalSystemServiceImpl implements ExternalSystemService { private EntityManager realEntityManager; ... @PersistenceContext(unitName = "hist") private EntityManager historyEntityManager; ... @Override public ExternalSystemResultDTO getExternalSystemResultByQuery(String vehId, ExternalQueryDTO externalQueryDTO, boolean queryFromHistDB, String type) { String queryText = externalQueryDTO.getQueryText(); queryText = tools.replString(queryText, "REPLACE_VEH_ID", vehId); if (queryFromHistDB) { Session session = realEntityManager.unwrap(Session.class); List<Object[]> resultList = session.createNativeQuery(queryText, Object[].class).setTupleTransformer(new AliasToBeanResultTransformer<>(Object[].class)).getResultList(); return handleExternalQueryTupleResult(externalQueryDTO, resultList , queryFromHistDB, type); } else { Session session = historyEntityManager.unwrap(Session.class); List<Object[]> resultList = session.createNativeQuery(queryText, Object[].class).setTupleTransformer(new AliasToBeanResultTransformer<>(Object[].class)).getResultList(); return handleExternalQueryTupleResult(externalQueryDTO, resultList , queryFromHistDB, type); } } }
需要Hibernate 6.1.3.Final来支持FROM/JOIN子句中使用子查询的功能。
排查与解决步骤
1. 解决依赖冲突
Hibernate 6和Spring生态(尤其是Spring Boot)自带的Hibernate版本极易冲突,这是最常见的原因:
- 如果你用Spring Boot,不要手动添加Hibernate核心依赖,而是通过
spring-boot-starter-data-jpa管理版本。需要指定6.1.3.Final的话,直接在配置中覆盖版本:
Maven:
Gradle:<properties> <hibernate.version>6.1.3.Final</hibernate.version> </properties>ext['hibernate.version'] = '6.1.3.Final' - 用依赖树命令排查冲突:Maven执行
mvn dependency:tree,Gradle执行gradle dependencies,找到并排除旧版本的Hibernate依赖。
2. 检查类导入是否正确
Hibernate 6基于Jakarta EE API,不再兼容旧的javax包:
EntityManager必须导入jakarta.persistence.EntityManager,而非javax.persistence.EntityManagerSession必须导入org.hibernate.Session
如果代码里还是用的javax包,直接替换成jakarta的就能解决访问权限问题。
3. 确认EntityManager注入有效性
代码中realEntityManager仅通过@AllArgsConstructor注入,未加@PersistenceContext:
- 给
realEntityManager添加@PersistenceContext并指定对应持久化单元名称,比如:@PersistenceContext(unitName = "real") // 替换为你实际的持久化单元名 private EntityManager realEntityManager; - 或者确保Spring容器中存在对应
EntityManager的Bean定义,让@AllArgsConstructor能正确注入实例。
4. 注意Hibernate 6的API变更
虽然不是当前报错的直接原因,但AliasToBeanResultTransformer在Hibernate 6中已被废弃,建议替换为AliasToBeanConstructorResultTransformer,避免后续出现其他问题。
内容的提问来源于stack exchange,提问作者Erdel
相关产品推荐
相关产品推荐

