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

A JTA EntityManager cannot use getTransaction() in stored procedure call

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

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>

我没有任何实体class。我只想调用更新一些 table.

的存储过程

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

EntityManagers 事务无法使用,因为它是本地事务,因此无法在您的应用程序外部处理。另请阅读 this post 了解更多信息。

如果你需要交易你应该使用UserTransaction

@Resource
UserTransaction utx;

要使用它,请注释您的 bean

@TransactionManagement(TransactionManagementType.BEAN)

并使用类似

的交易
utx.begin();
   ...
utx.commit(); // utx.rollback();