Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Java JTA EntityManager不能在存储过程调用中使用getTransaction()_Java_Jakarta Ee_Ejb_Entitymanager_Jta - Fatal编程技术网

Java JTA EntityManager不能在存储过程调用中使用getTransaction()

Java JTA EntityManager不能在存储过程调用中使用getTransaction(),java,jakarta-ee,ejb,entitymanager,jta,Java,Jakarta Ee,Ejb,Entitymanager,Jta,我想通过调用存储过程在ejb方法中执行异步事务操作。当我调用该方法时,我给出以下错误: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() Bean @Stateless public class FileSearchDAO { private static Logger logger = LoggerFactory.getLogger(FileSearchDAO.class)

我想通过调用存储过程在ejb方法中执行异步事务操作。当我调用该方法时,我给出以下错误:

java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
Bean

@Stateless
public class FileSearchDAO {
    private static Logger logger = LoggerFactory.getLogger(FileSearchDAO.class);

    @PersistenceContext(unitName = "FileSearchPU")
    private EntityManager entityManager;

    @Asynchronous
    public Future<String> saveFile(String fileNo, List<String> runningFiles) {
        try {
            entityManager.getTransaction().begin();
            entityManager.createNativeQuery(
                    " BEGIN prc_save_file (:fileNo); END;")
                    .setParameter("fileNo", fileNo).executeUpdate();
            entityManager.getTransaction().commit();
            runningFiles.remove(fileNo);
            return new AsyncResult<>(fileNo);
        } catch (Exception ex) {
            ex.printStackTrace();
            return new AsyncResult<>(ex.getMessage());
        }
    }
@无状态
公共类FileSearchDAO{
私有静态记录器Logger=LoggerFactory.getLogger(FileSearchDAO.class);
@PersistenceContext(unitName=“FileSearchPU”)
私人实体管理者实体管理者;
@异步的
公共未来保存文件(字符串文件号,列表运行文件){
试一试{
entityManager.getTransaction().begin();
entityManager.createNativeQuery(
“开始保存文件(:fileNo);结束;”)
.setParameter(“fileNo”,fileNo).executeUpdate();
entityManager.getTransaction().commit();
运行文件。删除(文件号);
返回新的异步结果(fileNo);
}捕获(例外情况除外){
例如printStackTrace();
返回新的AsyncResult(例如getMessage());
}
}
persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="FileSearchPU" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/FileSearchDS</jta-data-source>
        <properties>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.transaction.jta.platform"
                      value="${hibernate.transaction.jta.platform}"/>
        </properties>
    </persistence-unit>
</persistence>

org.hibernate.jpa.HibernatePersistenceProvider
jdbc/FileSearchDS

我没有任何实体类。我只想调用更新某些表的存储过程。

JTA
托管数据源容器中,以分布式方式处理事务,例如在应用程序外部处理并发性

EntityManager
s事务无法使用,因为它是本地事务,因此无法在应用程序外部处理。有关详细信息,请参阅

如果需要交易,则应使用
UserTransaction

@Resource
UserTransaction utx;
使用它来注释bean

@TransactionManagement(TransactionManagementType.BEAN)
并使用类似事务的

utx.begin();
   ...
utx.commit(); // utx.rollback();

谢谢。em.joinTransaction()是否也有必要?@mohammad_1m2我认为这在您的情况下没有必要或无关紧要,因为持久性上下文可能无论如何都不会知道存储过程中发生了什么。但是如果您正在处理实体,是的。我想使用它不会有什么害处。