首页 文章

如何判断我的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;
      }
    
    }
    
  • 0

    当您在JTA实体管理器上调用 getTransaction() 时,持久性提供程序将抛出 IllegalStateException .

    有关详细信息,请参阅javadoc

    EntityTransaction getTransaction()返回资源级EntityTransaction对象 . 可以串行使用EntityTransaction实例来开始和提交多个事务 . 返回:EntityTransaction实例抛出:IllegalStateException - 如果在JTA实体管理器上调用

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

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

相关问题