gpt4 book ai didi

java - EntityManager JNDI 查找

转载 作者:行者123 更新时间:2023-12-05 04:53:58 24 4
gpt4 key购买 nike

查找 JBoss 6 启动时显示的持久化单元 JPA-DB 的正确 JNDI 字符串是什么:

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 TreeView 找到名称:

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

看起来像这样:

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。

关于java - EntityManager JNDI 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65907266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com