我如何确定我的EntityManager是使用JTA还是RESOURCE_LOCAL数据源?

5
我有一个实用程序类,如下所示。 我想能够将此类与RESOURCE_LOCAL或JTA持久性单元一起使用。 如果我将persistence.xml从JTA更改为RESOURCE_LOCAL,则不应更改代码。
我尝试使用EntityManager.getTransaction()查看是否存在活动事务,但是如果使用JTA,则调用getTransaction()会引发异常。 我可以用try / catch包围对getTransaction()的调用,但我不想为此使用例外处理。 EntityManager.getProperties()没有显示任何指示JTA或RESOURCE_LOCAL的内容。
我需要某种方式来告诉下面的代码中EntityManager(或EntityManagerFactory)正在使用什么类型的持久性单元。
public class CredentialsUtil {

public static final String VGBD_PU = "VGDBpu";
static Logger logger = Logger.getLogger(CredentialsUtilStatic.class);
static EntityManagerFactory emf = Persistence.createEntityManagerFactory(VGBD_PU);
public static final String sharedKey="pgpsympwd";



public static String getPassword(String username) {

    String selectStr = "select pgp_sym_decrypt(pgpsympassword, '" + sharedKey + "') from credentials where username='" + username + "'";

    EntityManager em =null;
    String password = "";

    try {
        em = emf.createEntityManager();

        java.util.Map<java.lang.String,java.lang.Object> propMap = em.getProperties();
        logger.info(propMap.keySet().size() + " properties");

        for (String key : propMap.keySet())
            logger.info(key + ", " + propMap.get(key));

        EntityTransaction tx = em.getTransaction(); ...
2个回答

2
您可以尝试以下方法,它依赖于两种实体管理器类型的不同事务API:
public boolean isResourceLocal(EntityManager em) {

  try {
    EntityTransaction tx = em.getTransaction();
    return true;
  } catch (IllegalStateException ex) {
    return false;
  }

}

1
自从 JPA 2.1 版本以后,你可以使用 em.isJoinedTransaction()。 - dmatej

0

当您在JTA实体管理器上调用getTransaction()时,持久性提供程序会抛出一个IllegalStateException异常。

有关详细信息,请参见javadoc

EntityTransaction getTransaction()

返回资源级别的EntityTransaction对象。 EntityTransaction实例可以被串行地用于开始和提交多个事务。

返回: EntityTransaction实例

Throws: IllegalStateException - 如果在JTA实体管理器上调用

当您使用EclipseLink时,这会导致当前事务回滚:

public EntityTransaction getTransaction() {
    try {
        return ((TransactionWrapper)this.transaction).getTransaction();
    } catch (RuntimeException e) {
        setRollbackOnly();
        throw e;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接