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

时间:2017-12-17 07:25:52

标签: java java-ee ejb entitymanager jta

我想通过调用存储过程在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>

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

1 个答案:

答案 0 :(得分:4)

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

无法使用

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

如果您需要交易,请使用UserTransaction

@Resource
UserTransaction utx;

使用它来注释你的bean

@TransactionManagement(TransactionManagementType.BEAN)

并使用像

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