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

升级应用后Tomcat启动报错:No transactional EntityManager available求助

解决Tomcat9启动报错:java.lang.IllegalStateException: No transactional EntityManager available

问题背景

应用升级后,Tomcat9启动时触发ContextListener中的Hibernate Search索引初始化逻辑,抛出核心错误:java.lang.IllegalStateException: No transactional EntityManager available,具体触发点为Search.getFullTextEntityManager(entityManager)后的索引创建操作。

原因分析

  1. EntityManager事务绑定问题:当前配置的SharedEntityManagerBean返回的共享EntityManager默认仅在已有事务上下文时才会绑定事务,而ContextListener初始化阶段不存在自动事务上下文,导致Hibernate Search无法获取事务化的EntityManager实例。
  2. 版本兼容性隐患:spring-data-jpa 2.2.13.RELEASE官方适配Hibernate 5.4.x版本,但当前使用的Hibernate核心/entitymanager为5.3.1.Final,版本不匹配可能引发事务管理逻辑的兼容性问题。

解决方案

方案1:手动为索引创建操作添加事务上下文

在ContextListener中通过Spring的TransactionTemplate手动开启事务,确保索引创建操作在事务环境中执行:

  1. 在applicationContext.xml中配置事务管理器和TransactionTemplate:
<!-- 新增JPA事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<!-- 配置TransactionTemplate用于手动事务管理 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
</bean>
  1. 修改demoWebContextListener.java中的索引初始化代码:
// 获取TransactionTemplate
TransactionTemplate transactionTemplate = applicationContext.getBean(TransactionTemplate.class);
entityManager = (EntityManager) applicationContext.getBean(DemoConstants.ENTITY_MANAGER_BEAN_NAME);
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);

try {
    // 用TransactionTemplate包裹索引创建操作,确保事务上下文存在
    transactionTemplate.execute(status -> {
        try {
            fullTextEntityManager.createIndexer(LessonBO.class).startAndWait();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException("Hibernate Search索引创建被中断", e);
        }
        return null;
    });
} catch (RuntimeException e) {
    e.printStackTrace();
}

方案2:调整SharedEntityManagerBean配置(可选)

修改entityManager bean的配置,显式指定事务属性(部分场景下可解决,但不如方案1可靠):

<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <!-- 显式设置为事务绑定模式 -->
    <property name="transactional" value="true"/>
</bean>

方案3:修复依赖版本兼容性

将Hibernate核心及entitymanager版本升级至与spring-data-jpa 2.2.13.RELEASE兼容的5.4.x版本,避免版本不匹配引发的潜在问题:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.32.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.4.32.Final</version>
    <exclusions>
        <exclusion>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
        </exclusion>
        <exclusion>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

验证建议

优先尝试方案1(手动事务管理),这是最直接解决事务上下文缺失问题的方式;若仍有异常,再结合方案3升级依赖版本,彻底消除兼容性隐患。

内容的提问来源于stack exchange,提问作者rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:02:49