【问题标题】:EntityManager JNDI LookupEntityManager JNDI 查找
【发布时间】: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 管理的。

标签: java hibernate jpa jboss jndi


【解决方案1】:

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

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

看起来像这样:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2019-03-19
    • 2011-08-08
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多