【问题标题】:How do I tell if my EntityManager is using JTA or RESOURCE_LOCAL datasource?如何判断我的 EntityManager 使用的是 JTA 还是 RESOURCE_LOCAL 数据源?
【发布时间】:2011-12-22 01:03:51
【问题描述】:

我有一个实用程序类,如下所示。我希望能够将此类与 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(); ...

【问题讨论】:

    标签: jpa jta entitymanager


    【解决方案1】:

    您可以尝试这样的事情,它依赖于两种实体管理器类型的不同交易 API:

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

    【讨论】:

    • 从 JPA 2.1 开始你可以使用 em.isJoinedTransaction()
    【解决方案2】:

    当您在 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2020-10-18
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多