Spring IllegalStateException:JTA EntityManager无法使用getTransaction()
因此,在一个重大的重构项目之后,我留下了这个例外,并且不确定如何纠正它。 它处理的是一些我没写过的代码,我不熟悉它是如何工作的。 还有其他问题处理这个例外,但似乎没有一个问题适合我的情况。
使用EntityManager
的类是SpecialClaimsCaseRepositoryImpl
:
package com.redacted.sch.repository.jpa; //Imports @Repository public class SpecialClaimsCaseRepositoryImpl extends SimpleJpaRepository implements SpecialClaimsCaseRepository{ @PersistenceContext(unitName = "schManager") private EntityManager em; //Some autogenerated methods public void setEntityManager(EntityManager em) { this.em = em; } public EntityManager getEntityManager() { return em; } }
persistence.xml中:
org.hibernate.ejb.HibernatePersistence jdbc/SCH_DS com.redacted.sch.domain.model.SpecialClaimsCaseDto
sch_model_spring.xml:
这是我的项目结构:
>
这是堆栈跟踪的一部分,在此fpaste处有完整的跟踪
Caused by: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:985) at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:67) at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) ... 80 more
我在这里总是菜鸟,所以如果需要任何其他信息,请问我会更新。
感谢您的帮助!
问题是你的配置。 您已为JTA配置了hibernate。
而您使用本地事务而不是分布式事务。
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
您有两种可能的解决方案
- 删除
JpaTransactionManager
并将其替换为JTA事务管理器 - 从hibernate设置中删除hibernate.transaction.manager_lookup_class。
如果你真的不需要分布式事务,那么选项2是最简单的,如果你需要分布式事务,只需添加
就可以为你的环境设置一个合适的JTA tx管理器。 删除JpaTransactionManager
的定义。
更新:
您的配置有两种方式存在缺陷。
- 您的EntityManager配置已包含数据源的jndi查找,您可以通过配置本地数据源在applicationContext中覆盖该数据源
- 您有一个
和JpaTransactionManager
,您想要使用哪一个? 目前后者正在压倒第一个。
创建2个单独的配置,一个用于本地测试,另一个用于生产,使用JTA和JNDI查找。 (优选您的测试代码仅覆盖必要的bean)。
使用WebSphereTransactionManagerLookup
在Hibernate中进行事务管理器查找
并删除当前的事务管理器并将其替换为WebSphereUowTransactionManager
。
在Spring中进行事务管理器查找。
有关更深入的文档,请参阅IBM Websphere和Spring文档。