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 在try/catch异常块内持久化时的TransactionRequiredException_Jpa_Jakarta Ee_Java Ee 7_Javax.persistence - Fatal编程技术网

Jpa 在try/catch异常块内持久化时的TransactionRequiredException

Jpa 在try/catch异常块内持久化时的TransactionRequiredException,jpa,jakarta-ee,java-ee-7,javax.persistence,Jpa,Jakarta Ee,Java Ee 7,Javax.persistence,我没有使用Spring,所以这没有帮助,只是简单的JavaEE7,我为批处理作业构建了一个步骤监视拦截器,它记录每个步骤(成功与否),并将结果保存在DB中。现在对于不成功的步骤,我捕获异常并调用logQueryOutcome方法,当抛出异常时,事务似乎不再可用,也无法启动新的事务 public Object monitorStep(InvocationContext invocationContext) { try { //business logic here

我没有使用Spring,所以这没有帮助,只是简单的JavaEE7,我为批处理作业构建了一个步骤监视拦截器,它记录每个步骤(成功与否),并将结果保存在DB中。现在对于不成功的步骤,我捕获异常并调用logQueryOutcome方法,当抛出异常时,事务似乎不再可用,也无法启动新的事务

 public Object monitorStep(InvocationContext invocationContext) {
    try {
        //business logic here
        logQueryOutcome(invocationContext, result, timedDescription);
        return invocationContext.proceed();
    } catch (Exception e) {
        logQueryOutcome(invocationContext, result, timedDescription);
        return null;
    }
}

private void logQueryOutcome(InvocationContext invocationContext, String result, String timedDescription) {
    stream(invocationContext.getParameters()).filter(s -> s instanceof String).forEach(s -> {
        String queryName = (String) s;
        monitoringRepository.logStepResult(queryName);
    });
}
在注入的MonitoringRepository类中,logStepResults的实现是:

public void logStepResult(String queryName) {
    //Object instantiation and build
    Object obj = new Object(queryName)
    entityManager.persist(obj);
}
为了这个问题,我简化了我的代码。 我的问题是,为什么这个事务在正常的批处理作业步骤流中工作正常,而在抛出异常时却无法持久化?是否有解决方法? 我曾尝试使用dontRollbackOn为异常添加Transactional,我曾尝试过TransactionAttribute,如REQUIRED或RequiredNew,但没有成功。我正在从事的项目也迫使我只使用注释方法,因此目前无法使用会话或从实体管理器获取事务。这是一个例外:

Failed to run batchlet org.jberet.job.model.RefArtifact@32ba50d7: javax.persistence.TransactionRequiredException: WFLYJPA0060: Transaction is required to perform this operation (either use a transaction or extended persistence context)
    at org.jboss.as.jpa.container.AbstractEntityManager.transactionIsRequired(AbstractEntityManager.java:877)
    at org.jboss.as.jpa.container.AbstractEntityManager.persist(AbstractEntityManager.java:579)
    at com.myproj.MonitoringRepository.logStepResult(MonitoringRepository.java:28)