Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa EJB@Schedule方法中没有活动事务_Jpa_Jakarta Ee_Ejb_Jta - Fatal编程技术网

Jpa EJB@Schedule方法中没有活动事务

Jpa EJB@Schedule方法中没有活动事务,jpa,jakarta-ee,ejb,jta,Jpa,Jakarta Ee,Ejb,Jta,我有一个带有@Schedule标记方法的EJB,它将实体持久化到数据库。在这个方法中,当我在persist之后调用EntityManager.flush时,我得到的是javax.persistence.TransactionRequiredException:当前没有活动的事务 AFAIK所有EJB方法都是事务性的,但即使我另外用@TransactionAttributeREQUIRED标记该方法,也会出现此错误 当我通过EntityTransaction.begin和commit手动管理事务时

我有一个带有@Schedule标记方法的EJB,它将实体持久化到数据库。在这个方法中,当我在persist之后调用EntityManager.flush时,我得到的是javax.persistence.TransactionRequiredException:当前没有活动的事务

AFAIK所有EJB方法都是事务性的,但即使我另外用@TransactionAttributeREQUIRED标记该方法,也会出现此错误

当我通过EntityTransaction.begin和commit手动管理事务时,一切正常

我正在JDK 8u74上使用Wildfly 10.0决赛,EclipseLink 2.6.0

这是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">    
    <persistence-unit name="mainPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:/datasources/ExampleDS</jta-data-source>
        <class>com.example.MyEntity</class>
    </persistence-unit>    
</persistence>

使用JTA时,它会将更改提交并刷新到数据库中,并关闭当前事务。因此,当您执行em.flush时,事务已经关闭。

doStuff真的是一个私有方法吗?如果是这样的话,就不太可能被正确调用。是的,doStuff是一个私有方法,它通过计时器进行调用。你让我仔细检查了规范,你是对的:超时回调方法可以具有公共、私有、受保护或包级访问。超时回调方法不能声明为final或static。这适用于EJB3.1和3.2谢谢这可能是Eclipse JPA的集成缺陷。如果你注释掉了。。。因此使用默认的Hibernate JPA实现?不,只有在方法返回时才提交事务,而不是在调用em.merge时提交,否则异常将无法回滚同一方法内的事务
package com.example;

import javax.ejb.*;
import javax.ejb.Timer;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Startup
@DependsOn("AppUtils")
@Singleton
public class MyEJB {
    @PersistenceContext(unitName = "mainPU")
    private EntityManager em;

    @Schedule(hour = "*", minute = "*", second = "*/20", info = "", persistent = false)
    private void doStuff(Timer timer) {
        MyEntity entity = new MyEntity("Test" + Math.random(), "Test value");
        em.merge(entity);
        em.flush();
    }
}