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

问题描述 投票:3回答:1

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

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

@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());
        }
    }

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>

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

java java-ee ejb entitymanager jta
1个回答
4
投票

JTA托管数据源容器中以分布式方式处理事务,因此也可以处理应用程序外部的并发性。

无法使用EntityManagers事务,因为它是本地事务,因此不会在应用程序之外处理。另请阅读this post以获取更多信息。

如果您需要交易,您应该使用UserTransaction

@Resource
UserTransaction utx;

要使用它,请注释您的bean

@TransactionManagement(TransactionManagementType.BEAN)

并使用像

utx.begin();
   ...
utx.commit(); // utx.rollback();
© www.soinside.com 2019 - 2024. All rights reserved.