升级应用后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)后的索引创建操作。
原因分析
- EntityManager事务绑定问题:当前配置的
SharedEntityManagerBean返回的共享EntityManager默认仅在已有事务上下文时才会绑定事务,而ContextListener初始化阶段不存在自动事务上下文,导致Hibernate Search无法获取事务化的EntityManager实例。 - 版本兼容性隐患:spring-data-jpa 2.2.13.RELEASE官方适配Hibernate 5.4.x版本,但当前使用的Hibernate核心/entitymanager为5.3.1.Final,版本不匹配可能引发事务管理逻辑的兼容性问题。
解决方案
方案1:手动为索引创建操作添加事务上下文
在ContextListener中通过Spring的TransactionTemplate手动开启事务,确保索引创建操作在事务环境中执行:
- 在
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>
- 修改
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
相关产品推荐
相关产品推荐

