2

是否可以使用 EclipseLink 检测 Bean Managed Transaction 中的事务类型(JTA 或 Resource Local)?如果是,如何做到这一点?

实际上,如果可能的话,我还需要在 java 类中检测事务类型和 JNDI 名称。

4

1 回答 1

3

您可以按如下方式检测交易类型;

EntityManager em = emf.createEntityManager();

boolean isJta = false;
try {
    EntityTransaction et = em.getTransaction();
} catch (IllegalStateException ise) {
    if (ise.getMessage().startsWith("A JTA EntityManager cannot use getTransaction")) {
        isJta = true;
    }
}

您可能需要调整错误消息:这与 Hibernate (4.x) 抛出的内容相匹配,EclipseLink 可能会抛出稍微不同的消息(尽管可能是相同的异常类实例)。

至于数据源或持久性单元的 JNDI 名称,这种类型的信息 AFAIK 不会被 JPA 类公开。您也许可以使用 EclipseLink(或对于其他 ORM 框架,ORM-framework-specific)方法来提取它。换句话说,该EntityManagerFactory实例当然是实现该接口的 EclipseLink 类的实例。我会调试一个测试,你有一个 EMF 实例并查看它的字段和属性。

否则,您可能能够扫描 JNDI 目录并挑选出正确的目录,例如,请参见此处的代码。

于 2013-08-30T13:12:52.667 回答