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) 

您有两种可能的解决方案

  1. 删除JpaTransactionManager并将其替换为JTA事务管理器
  2. 从hibernate设置中删除hibernate.transaction.manager_lookup_class。

如果你真的不需要分布式事务,那么选项2是最简单的,如果你需要分布式事务,只需添加就可以为你的环境设置一个合适的JTA tx管理器。 删除JpaTransactionManager的定义。

更新:

您的配置有两种方式存在缺陷。

  1. 您的EntityManager配置已包含数据源的jndi查找,您可以通过配置本地数据源在applicationContext中覆盖该数据源
  2. 您有一个JpaTransactionManager ,您想要使用哪一个? 目前后者正在压倒第一个。

创建2个单独的配置,一个用于本地测试,另一个用于生产,使用JTA和JNDI查找。 (优选您的测试代码仅覆盖必要的bean)。

使用WebSphereTransactionManagerLookup在Hibernate中进行事务管理器查找

  

并删除当前的事务管理器并将其替换为WebSphereUowTransactionManager

   

在Spring中进行事务管理器查找。

有关更深入的文档,请参阅IBM Websphere和Spring文档。