EntityManager JNDI 查找

Posted

技术标签:

【中文标题】EntityManager JNDI 查找【英文标题】:EntityManager JNDI Lookup 【发布时间】:2021-04-30 14:04:24 【问题描述】:

什么是正确的 JNDI 字符串来查找显示在 JBoss 6 Startup here 上的这个持久性单元 JPA-DB:

10:26:09,847 INFO  [PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=tpar.ear/tpar-jboss-ejb3.jar#JPA-DB
10:26:09,847 INFO  [Ejb3Configuration] Processing PersistenceUnitInfo [
        name: JPA-DB
        ...]        
10:26:09,847 WARN  [Ejb3Configuration] Persistence provider caller does not implement the EJB3 spec correctly.PersistenceUnitInfo.getNewTempClassLoader() is null.
...
...
10:26:10,950 INFO  [NamingHelper] JNDI InitialContext properties:java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
10:26:10,950 INFO  [NamingHelper] Creating subcontext: persistence.unit:unitName=tpar.ear
10:26:10,950 INFO  [SessionFactoryObjectFactory] Bound factory to JNDI name: persistence.unit:unitName=tpar.ear/tpar-jboss-ejb3.jar#JPA-DB
10:26:10,950 INFO  [NamingHelper] JNDI InitialContext properties:java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces        

我已经尝试了以下以及我现在不记得的其他各种方法,它们都抛出了 NameNotFoundException:

entityManager = (EntityManager) jndi.lookup("java:/EntityManagers/JPA-DB");
entityManager = (EntityManager) jndi.lookup("java:comp/EntityManagers/JPA-DB");
entityManager = (EntityManager) jndi.lookup("java:comp/env/JPA-DB");
entityManager = (EntityManager) jndi.lookup("JPA-DB");

【问题讨论】:

也许this 会有所帮助。 尝试添加 <property name="jboss.entity.manager.jndi.name" value="java:/jpaEntity"/><property name="jboss.entity.manager.factory.jndi.name" value="java:/jpaEntityFactory"/> 并同时使用 JPA-DBjava:/jpaEntity 进行查找,但没有成功。我必须使用的完整 JNDI 字符串是什么?人们在线程中使用注解,我不能使用它,因为我需要注入的类不是由 CDI 管理的。 【参考方案1】:

我可以通过查看 JNDI 树视图找到该名称:

    转到http://localhost:8080/jmx-console 搜索JNDIView,点击链接service=JNDIView list() 方法的调用按钮。 在结果树视图中搜索持久性名称。

看起来像这样:

Global JNDI Namespace

+- persistence.unit:unitName=tpar.ear (class: org.jnp.interfaces.NamingContext)
  |   +- tpar-jboss-ejb3.jar#JPADB (class: org.hibernate.impl.SessionFactoryImpl)

虽然,该对象实际上是 SessionFactoryImpl 而不是 EntityManager。 此外,JBoss 生成的 jndi 查找字符串是可怕的:

jndi.lookup("persistence.unit:unitName=tpar.ear/tpar-jboss-ejb3.jar#JPADB");

通过将以下属性添加到 persistence.xml,我可以使用较短的名称进行查找,同时将对象作为 EntityManager 获取:

<property name="jboss.entity.manager.jndi.name" value="tpar/entity-manager"/>

请注意,使用长 JNDI 名称仍会返回 SessionFactoryImpl 对象,以防万一有人想要 SessionFactory。

【讨论】:

以上是关于EntityManager JNDI 查找的主要内容,如果未能解决你的问题,请参考以下文章

将 Spring 数据源绑定到 JNDI

运行时来自数据源的 JPA 实体管理器

ActiveMQ JNDI 查找问题

为啥我对 QueueConnectionFactory 的 JNDI 查找返回 null?

JPA EntityManager 查找方法不起作用[关闭]

EntityManager方法简介