JPA异常:此线程当前没有活动的外部管理事务

JPA异常:此线程当前没有活动的外部管理事务,jpa,websphere-liberty,open-liberty,Jpa,Websphere Liberty,Open Liberty,尝试使用executeUpdate插入/更新/删除时引发异常。Select查询工作正常。我已经尝试了堆栈溢出中前面提到的类似错误的所有建议。感谢您的指导 环境:WebSphereLiberty:17.0.0.2,Eclipselink 2.6.4,JPA2.1 Liberty server上启用的功能 } } 服务器启动时的日志 在IBM J9虚拟机上启动defaultServer WebSphere Application Server 17.0.0.2/wlp-1.0.17.cl170220

尝试使用executeUpdate插入/更新/删除时引发异常。Select查询工作正常。我已经尝试了堆栈溢出中前面提到的类似错误的所有建议。感谢您的指导

环境:WebSphereLiberty:17.0.0.2,Eclipselink 2.6.4,JPA2.1

Liberty server上启用的功能

} }

服务器启动时的日志 在IBM J9虚拟机上启动defaultServer WebSphere Application Server 17.0.0.2/wlp-1.0.17.cl170220170523-1818,版本pwa6480sr4fp5-20170421_01 SR4 FP5 en_US

[审核]CWWKF0012I:服务器安装了以下功能:[jsp-2.3、ejbLite-3.2、servlet-3.1、jsf-2.2、beanValidation-1.1、ssl-1.0、jndi-1.0、jca-1.7、jdbc-4.2、localConnector-1.0、appSecurity-2.0、jaxrs-2.0、restConnector-1.0、el-3.0、jaxrclient-2.0、concurrent-1.0、wmqJmsClient-2.0、jaxb-2.2.2.2、json-1.0、jpaContainer-2.1.1、adminicenter-1.0、cdi-1.0、edmap-1.1.0、edma-1.1.1、jpa-1.1.2]

[审计]CWWKF0011I:服务器defaultServer已准备好运行一个更智能的星球

[EL Info]:服务器:2017-10-19 10:23:13.215-ServerSession1864654006-Detected服务器平台:org.eclipse.persistence.platform.server.was.WebSphere_Liberty_平台。

例外情况: [err]javax.persistence.TransactionRequiredException: 异常描述:此线程当前没有活动的外部管理事务

[err]位于org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.throwCheckTransactionFailedExceptionJTATransactionWrapper.java:94

[错误]位于org.eclipse.persistence.internal.jpa.transaction.jttransactionwrapper.checkforTransactionjttransactionwrapper.java:54

[错误]位于org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransactionEntityManagerImpl.java:2054

[错误]位于org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdateQueryImpl.java:291


[呃]在com.bcbsnc.providers.dao.JPADao.purgeBxTablesJPADao.java:49

上,executeUpdate方法要求EntityManager与一个事务(在本例中是一个全局事务)一起登记,因为您已经定义了一个JTA类型的持久化单元。您已经选择使用persistence.createEntityManagerFactory使用JPA的JSE引导方法ry而不是通过@PersistenceContext或@PersistenceUnit注入-虽然我不赞成在EE应用程序中使用JSE引导方法,但规范不允许这样做

然而,我相信您遇到的问题是,实际上您这里拥有的是一个应用程序管理的持久性上下文,因此您的应用程序负责登记全局事务,该事务在调用purgeBxTables时会由EJB容器自动启动,因为我没有看到任何将其声明为bean管理的事务会话bean的符号,需要调用EntityManager.joinTransaction

应用程序管理的EntityManager只有在首次创建EntityManager时才会自动加入全局事务。对于您的应用程序而言,情况并非如此,因为EntityManager是在构造bean类时创建的。否则,EntityManager需要调用joinTransaction方法才能加入全局事务新交易

在调用executeUpdate之前,应用程序需要调用em.joinTransaction


使用容器管理的持久性上下文(使用@PersistenceContext)注入EntityManager将使EntityManager自动加入全局事务,除非您将默认事务同步类型重写为非同步。

为什么不在EJB中使用@PersistenceContext注入EntityManager?如果这样创建它,那么就没有活动事务了。忘了提一下,我使用的是Spring版本4.1.6。当我用@PersistenceContextunitName=BlueeCron注释EnttyManger时。获取异常:由以下原因引起:org.springframework.beans.factory.nosuchbean定义异常:没有定义名为“BlueeCron”的bean。需要注意的是,您r应用程序使用无状态会话bean的构造函数创建EntityManagerFactory,这是创建EntityManager实例的部分工作,但对创建的EntityManagerFactory的引用丢失。关闭创建的EntityManagerFactory实例以防止资源泄漏是一个好做法。此外,您的无状态会话Bean对EntityManager的使用是一次性的,因为您在finally块中关闭了它。对该无状态会话Bean的下一次调用将失败,因为它将尝试使用一个关闭的EntityManagerTanks FyreWyld,它在我设置joinTransaction时起作用。现在,尝试找出如何使用@PersistenceContext使其工作。
<featureManager>
    <feature>adminCenter-1.0</feature>
    <feature>beanValidation-1.1</feature>
    <feature>cdi-1.2</feature>
    <feature>concurrent-1.0</feature>
    <feature>ejbLite-3.2</feature>
    <feature>el-3.0</feature>
    <feature>jsf-2.2</feature>
    <feature>jsp-2.3</feature>
    <feature>localConnector-1.0</feature>
    <feature>servlet-3.1</feature>
    <feature>jpa-2.1</feature>
    <!--The following features are available in Liberty base and above. -->
    <feature>jaxb-2.2</feature>
</featureManager>
<?xml version="1.0" encoding="UTF-8"?>
 <persistence version="2.1"
   xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
   http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="BlueeCron" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/BlueeUPMDataSource</jta-data-source>
    <mapping-file>META-INF/queries.xml</mapping-file>
    <class>com.bcbsnc.providers.models.BlueEReqst</class>
    <class>com.bcbsnc.providers.models.BlueERespn</class>
    <properties>
        <property name="eclipselink.logging.level" value="ALL" />
        <property name="eclipselink.logging.level.sql" value="FINE" />
        <property name="eclipselink.logging.parameters" value="true" />
    </properties>
</persistence-unit>
@Stateless
@Repository("emJPADao")
public class JPADao {

EntityManager entityManager = Persistence.createEntityManagerFactory("BlueeCron").createEntityManager();

public Integer purgeBxTables() {
    Integer rowsDeleted = 0;
    try {
        Integer noOfDays = Integer.parseInt(this.getConfigurationData("PurgeBXTablesPeriod"));
        rowsDeleted = entityManager.createNamedQuery("PURGE_BX_TABLES").setParameter("noOfDays", getTimeStamp(noOfDays, false)).executeUpdate();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        if(entityManager.isOpen())
            entityManager.close();
    }