EntityManager JNDI 查找
EntityManager JNDI Lookup
查找 JBoss 上显示的持久性单元 JPA-DB 的正确 JNDI 字符串是什么 6 在此处启动:
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");
我能够通过查看 JNDI 树视图找到名称:
- 转到
http://localhost:8080/jmx-console
- 搜索 JNDIView 并单击 link
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 名称 returns SessionFactoryImpl 对象,以防有人需要 SessionFactory。
查找 JBoss 上显示的持久性单元 JPA-DB 的正确 JNDI 字符串是什么 6 在此处启动:
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");
我能够通过查看 JNDI 树视图找到名称:
- 转到
http://localhost:8080/jmx-console
- 搜索 JNDIView 并单击 link
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 名称 returns SessionFactoryImpl 对象,以防有人需要 SessionFactory。