是否可以使用 EclipseLink 检测 Bean Managed Transaction 中的事务类型(JTA 或 Resource Local)?如果是,如何做到这一点?
实际上,如果可能的话,我还需要在 java 类中检测事务类型和 JNDI 名称。
是否可以使用 EclipseLink 检测 Bean Managed Transaction 中的事务类型(JTA 或 Resource Local)?如果是,如何做到这一点?
实际上,如果可能的话,我还需要在 java 类中检测事务类型和 JNDI 名称。
您可以按如下方式检测交易类型;
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 目录并挑选出正确的目录,例如,请参见此处的代码。