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

ver*_*jan 7 java tomcat hibernate

我从4.2.7升级到Hibrernate 4.3.x时遇到问题.我有这个例外:

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
Run Code Online (Sandbox Code Playgroud)

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

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

4.3.0 - org.apache.naming.NamingContext

4.2.7 - org.apache.naming.SelectorContext

除此之外,我找不到任何更多的差异.

我在这个问题上找到了一些类似的主题,但都没有帮助.谢谢你的帮助.

Pet*_*der 0

是的,这实际上是有问题的,因为他们对如何session-factory工作以及工厂何时被要求连接的关注点不同。

因此,您需要在请求新连接时解决它session-factory才能使用它。session-factory

hibernate.cfg.xml尝试通过 hibernate 的唯一责任来解决 jndi 中的数据源,通过像这样的老派:

<hibernate-configuration>
    <session-factory name="data">
        <property name="connection.datasource">java:comp/env/jdbc/data</property>
    ...
Run Code Online (Sandbox Code Playgroud)

persistence.xml并通过如下方式解析配置:

<persistence version="2.0">
    <persistence-unit name="data">
        <properties>
            <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/>
Run Code Online (Sandbox Code Playgroud)

也许你也hbm2ddl必须搬到hibernate.cfg.xml那里。

玩得开心。