You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

引入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:
    <properties>
        <hibernate.version>6.1.3.Final</hibernate.version>
    </properties>
    
    Gradle:
    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.EntityManager
  • Session必须导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:46:06