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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JTA EntityManager不能在存储过程调用中使用getTransaction()相关的知识,希望对你有一定的参考价值。

我想通过调用存储过程在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类。我只想调用更新某些表的存储过程。

答案

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

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

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

@Resource
UserTransaction utx;

要使用它,请注释您的bean

@TransactionManagement(TransactionManagementType.BEAN)

并使用像

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

以上是关于JTA EntityManager不能在存储过程调用中使用getTransaction()的主要内容,如果未能解决你的问题,请参考以下文章

升级Spring依赖项后获取错误A JTA EntityManager无法使用getTransaction()

spring boot并调用存储过程注释或entityManager?

无法使用@PersistenceContext注入RESOURCE_LOCAL容器管理的EntityManager

JTA 和本地事务有啥区别?

在 Spring 存储库中注入 EntityManager 时出现 java.lang.NullPointerException

JPA 数据存储库 - 找到 2 个 EntityManager 类型的 bean