首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA异常:当前此线程没有外部托管事务处于活动状态

JPA异常:当前此线程没有外部托管事务处于活动状态
EN

Stack Overflow用户
提问于 2017-10-19 15:35:49
回答 1查看 5.2K关注 0票数 2

当尝试使用executeUpdate()插入/更新/删除时引发异常。选择query。我已经尝试过堆栈溢出中提到的以前类似错误的所有建议。感谢你的指导。

环境: Websphere : 17.0.0.2,Eclipselink 2.6.4,JPA 2.1

在自由服务器上启用了特性

代码语言:javascript
复制
<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>

Peristence.xml

代码语言:javascript
复制
<?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>

代码语言:javascript
复制
@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();
    }

}}

在服务器启动时记录

在IBM defaultServer VM上启动WebSphere (WebSphere Application 17.0.0.2/wlp-1.0.17.cl170220170523-1818),版本pwa6480sr4fp5-20170421_01 (SR4 FP5) (en_US)

审计CWWKF0012I:服务器安装了以下特性:JSP2.3、ejbLite-3.2、servlet-3.1、jsf-2.2、beanVal环流-1.1、ssl-1.0、jndi-1.0、jca-1.7、jdbc-4.2、localConnector-1.0、appSecurity-2.0、jaxs-2.0、restConnector-1.0、el-3.0、jaxrsClient-2.0、并发-1.0、wmqJmsClient 2.0、jaxb-2.2、json-1.0、jpaContainer-2.1,adminCenter-1.0,cdi-1.2,distributedMap-1.0,jpa-2.1.

审核CWWKF0011I:服务器defaultServer已经准备好运行一个更智能的星球。

EL信息:服务器: 2017-10-19 10:23:13.215--ServerSession(1864654006)--Detected服务器平台: org.eclipse.persistence.platform.server.was.WebSphere_Liberty_Platform.S

异常:

err javax.persistence.TransactionRequiredException:异常描述:当前此线程没有外部托管事务处于活动状态

在org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.throwCheckTransactionFailedException(JTATransactionWrapper.java:94)的错误

在org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.checkForTransaction(JTATransactionWrapper.java:54)的错误

在org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransaction(EntityManagerImpl.java:2054)的错误

在org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:291)的错误

在com.bcbsnc.providers.dao.JPADao.purgeBxTables(JPADao.java:49)的错误

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-19 16:24:07

executeUpdate()方法要求使用事务(在本例中为全局事务)登记EntityManager,因为您已经定义了JTA类型的持久性单元。您已经选择使用JPA的JSE引导方法(使用Persistence.createEntityManagerFactory(),而不是通过@PersistenceContext或@PersistenceUnit进行注入) --虽然我不赞同在EE应用程序中使用JSE引导方法,但规范不允许使用dis。

但是,我认为您遇到的问题是,您在这里实际上是一个应用程序管理的持久性上下文,因此您的应用程序负责将它登记到全局事务(在调用purgeBxTables()时由EJB容器自动启动,因为我没有看到任何将其声明为bean管理的事务会话bean的注释),它需要调用EntityMangager.joinTransaction()。

应用程序管理的EntityManager只有在第一次创建EntityManager时才会自动加入全局事务。这不是应用程序的情况,因为EntityManager是在构造bean类时创建的。否则,joinTransaction()方法调用是EntityManager加入新事务所必需的。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46833684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档