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-DB
和 java:/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 查找的主要内容,如果未能解决你的问题,请参考以下文章
为啥我对 QueueConnectionFactory 的 JNDI 查找返回 null?