java - Hibernate 4.3 + Tomcat 7 无法查找 JNDI 名称

标签 java hibernate tomcat

我在从 4.2.7 升级到 Hibrernate 4.3.x 时遇到了问题。我得到了这个异常(exception):

Caused by: javax.naming.NameNotFoundException: Name [java:comp/env/jdbc/data] is not bound in this Context. Unable to find [java:comp].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
at javax.naming.InitialContext.lookup(InitialContext.java:415)
at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:114)
... 82 more

我正在使用 Tomcat 7.0.29(也尝试过 7.0.47)和 JDK 7 (v25)。 Hibernate 4.2.7 没有问题。

这是我的 persistence.xml:

<persistence-unit name="data" transaction-type="RESOURCE_LOCAL">
    <non-jta-data-source>java:comp/env/jdbc/data</non-jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

但我觉得问题不在这里。我做了一些调试研究,发现了以下内容:

JndiServiceImpl#locate(String jndiName) 创建一个不同的初始上下文。

4.3.0 - org.apache.naming.NamingContext

4.2.7 - org.apache.naming.SelectorContext

除此之外,我找不到更多的差异。

我为这个问题找到了一些类似的主题,但没有帮助。感谢您的帮助。

最佳答案

是的,它实际上是错误的,因为他们不同地关注 session-factory 的工作方式以及何时要求工厂建立连接。

因此您需要在 session-factory 后面解析它,以便在 session-factory 请求新连接时使用它。

尝试通过 old-scool hibernate.cfg.xml 解决 jndi 中的数据源,由 hibernate 单独负责,如下所示:

<hibernate-configuration>
    <session-factory name="data">
        <property name="connection.datasource">java:comp/env/jdbc/data</property>
    ...

然后通过 persistence.xml 解析配置,如下所示:

<persistence version="2.0">
    <persistence-unit name="data">
        <properties>
            <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/>

也许你的 hbm2ddl 也必须移动到 hibernate.cfg.xml

玩得开心。

关于java - Hibernate 4.3 + Tomcat 7 无法查找 JNDI 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20135117/

相关文章:

java - 使用 java 解析器删除 XML 节点

sql - Hibernate 如何最好地处理关联表/外键?

tomcat - Tomcat 中的 JPA Web 应用程序

apache - 无法在 Amazon EC2 上安装 solr

java - 为什么我不能使用 Comparator 对基元进行排序?

java - RxJava SerializedObserver 实现

java - 当线程通过另一个类调用同步方法时会发生什么?

java - spring mvc 3 与 hibernate (和 hibernate.hbm2ddl.auto)

hibernate - Hibernate 中 LEFT JOIN 和 LEFT JOIN FETCH 的区别?

tomcat - 通过 tomacat8 和 Struts2 的 SSL