是否可以使用EclipseLink检测Bean Managed Transaction中的事务类型(JTA或Resource Local)? 如果是的话,怎么办呢?
实际上我需要在java类中检测事务类型和JNDI名称。
答案 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。