Jpa EJB@Schedule方法中没有活动事务
我有一个带有@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: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手动管理事务时
<?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();
}
}