Java JTA EntityManager不能在存储过程调用中使用getTransaction()
我想通过调用存储过程在ejb方法中执行异步事务操作。当我调用该方法时,我给出以下错误:Java JTA EntityManager不能在存储过程调用中使用getTransaction(),java,jakarta-ee,ejb,entitymanager,jta,Java,Jakarta Ee,Ejb,Entitymanager,Jta,我想通过调用存储过程在ejb方法中执行异步事务操作。当我调用该方法时,我给出以下错误: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() Bean @Stateless public class FileSearchDAO { private static Logger logger = LoggerFactory.getLogger(FileSearchDAO.class)
java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
Bean
@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());
}
}
@无状态
公共类FileSearchDAO{
私有静态记录器Logger=LoggerFactory.getLogger(FileSearchDAO.class);
@PersistenceContext(unitName=“FileSearchPU”)
私人实体管理者实体管理者;
@异步的
公共未来保存文件(字符串文件号,列表运行文件){
试一试{
entityManager.getTransaction().begin();
entityManager.createNativeQuery(
“开始保存文件(:fileNo);结束;”)
.setParameter(“fileNo”,fileNo).executeUpdate();
entityManager.getTransaction().commit();
运行文件。删除(文件号);
返回新的异步结果(fileNo);
}捕获(例外情况除外){
例如printStackTrace();
返回新的AsyncResult(例如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>
org.hibernate.jpa.HibernatePersistenceProvider
jdbc/FileSearchDS
我没有任何实体类。我只想调用更新某些表的存储过程。在
JTA
托管数据源容器中,以分布式方式处理事务,例如在应用程序外部处理并发性
EntityManager
s事务无法使用,因为它是本地事务,因此无法在应用程序外部处理。有关详细信息,请参阅
如果需要交易,则应使用UserTransaction
@Resource
UserTransaction utx;
使用它来注释bean
@TransactionManagement(TransactionManagementType.BEAN)
并使用类似事务的
utx.begin();
...
utx.commit(); // utx.rollback();
谢谢。em.joinTransaction()是否也有必要?@mohammad_1m2我认为这在您的情况下没有必要或无关紧要,因为持久性上下文可能无论如何都不会知道存储过程中发生了什么。但是如果您正在处理实体,是的。我想使用它不会有什么害处。