如何检测事务的类型:来自Java代码的JTA或Resource Local?

时间:2013-08-29 09:17:18

标签: java jpa transactions jta

是否可以使用EclipseLink检测Bean Managed Transaction中的事务类型(JTA或Resource Local)? 如果是的话,怎么办呢?

实际上我需要在java类中检测事务类型和JNDI名称。

1 个答案:

答案 0 :(得分:2)

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

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名称,JPA类不公开该类型的信息AFAIK。您可以使用EclipseLink(或其他ORM框架,特定于ORM框架)方法来提取它。换句话说,EntityManagerFactory实例当然是实现该接口的EclipseLink类的实例。我会调试一个测试,你有一个EMF实例,并查看它的字段和属性。

否则,您可能能够扫描JNDI目录并选择正确的目录,例如,请参阅代码here