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
托管数据源容器中,以分布式方式处理事务,例如,还处理应用程序外部的并发。
EntityManager
s 事务无法使用,因为它是本地事务,因此无法在您的应用程序外部处理。另请阅读 this post 了解更多信息。
如果你需要交易你应该使用UserTransaction
@Resource
UserTransaction utx;
要使用它,请注释您的 bean
@TransactionManagement(TransactionManagementType.BEAN)
并使用类似
的交易
utx.begin();
...
utx.commit(); // utx.rollback();
我想通过调用存储过程在 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
托管数据源容器中,以分布式方式处理事务,例如,还处理应用程序外部的并发。
EntityManager
s 事务无法使用,因为它是本地事务,因此无法在您的应用程序外部处理。另请阅读 this post 了解更多信息。
如果你需要交易你应该使用UserTransaction
@Resource
UserTransaction utx;
要使用它,请注释您的 bean
@TransactionManagement(TransactionManagementType.BEAN)
并使用类似
的交易utx.begin();
...
utx.commit(); // utx.rollback();