Java 如何获取Oracle db事务id(替换Postgres txid_current())

Java 如何获取Oracle db事务id(替换Postgres txid_current()),java,sql,oracle,transactions,Java,Sql,Oracle,Transactions,我必须更改为使用Oracle Database 11g Express而不是PostgreSQL 9.5.4。我们使用JPA、Hibernate 3.5.0-Final、Java 8、JBoss、, 因此,我们: entityMgr.open(); entityMgr.begin(); entityMgr.merge(action); //entityMgr.flush(); // I have tried with and without - same result //entityMg

我必须更改为使用Oracle Database 11g Express而不是PostgreSQL 9.5.4。我们使用JPA、Hibernate 3.5.0-Final、Java 8、JBoss、, 因此,我们:

entityMgr.open();
entityMgr.begin();
entityMgr.merge(action);
//entityMgr.flush();    // I have tried with and without - same result
//entityMgr.getTransaction().isActive();    // returns true
Object transactionId = entityMgr.createNativeQuery("SELECT DBMS_TRANSACTION.LOCAL_TRANSACTION_ID FROM dual").getSingleResult();
...
由于某些原因,transactionId始终为空。从我读取的数据来看,如果没有事务,transactionId为null,但是从我的理解来看,有事务正在运行(如果uncommented transaction.isActive()返回true)。我们已连接到Oracle db,因为在此之前的其他操作工作正常。当我们使用Postgress之前,它工作正常,最后一行被替换为以下内容:

Object transactionId = entityMgr.createNativeQuery("SELECT txid_current()").getSingleResult();

我的代码有什么问题,请告诉我如何在Oracle中获取实际的transactionId?

DBMS\u事务。如果您尚未启动事务,本地\u事务\u ID
将返回
NULL

您可以使用
DBMS\u TRANSACTION.LOCAL\u TRANSACTION\u ID(create\u TRANSACTION=>TRUE)
告诉它启动一个新事务(如果还没有)。这样,它将永远不会返回
NULL

不幸的是,
BOOLEAN
参数在
SELECT..FROM DUAL
方法中不起作用。您需要创建一个包装器函数或其他东西,或者使用内联PL/SQL函数,如下所示:

WITH FUNCTION trx_id RETURN VARCHAR2 AS 
BEGIN
  RETURN DBMS_TRANSACTION.LOCAL_TRANSACTION_ID(true);
END;
SELECT trx_id FROM DUAL;