java - 使用 persistence.xml 时将 Hibernate 4.0 与 Tomcat 7 结合使用时出现 JndiException

标签 java hibernate tomcat jpa jndi

我在 Tomcat 7 上使用带有 JPA persistence.xml 文件的 Hibernate 4.0。没有 Struts,只是直接使用带有一些 Jersey 服务的 Hibernate。这是我遇到的异常:

Caused by: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [jdbc/MyDB]
    at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68)
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2273)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2269)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1738)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
    ... 8 more
Caused by: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
    at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:135)
    at javax.naming.InitialContext.lookup(InitialContext.java:396)
    at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:65)
    ... 23 more

我看到关于 jbc 的注释不受此上下文约束,但我对这是如何发生的感到困惑。我在下面的特定于应用程序的 context.xml 中部署我的上下文:

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="..." password="..." driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/mydb"/>
</Context>

我的 persistence.xml 文件如下所示:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

    <persistence-unit name="com.example.mysql" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>jdbc/MyDB</non-jta-data-source>
        <class>...</class>
        <properties>
            <property name="hibernate.connection.datasource" value="jdbc/MyDB"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.id.new_generator_mappings" value ="true"/>
        </properties>
    </persistence-unit>
</persistence>

最后,我的 web.xml 文件中的资源定义如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>My Web Application</display-name>
    <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/MyDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
...
</web-app>

至于我的布局,这里是我的 war 文件的结构:

app.war
    + META-INF
        - context.xml
    + WEB-INF
        + classes
            + META-INF
                - persistence.xml
        + lib
        - web.xml

一些小注意事项:

  • 使用全局上下文与特定于应用程序的上下文没有区别。
  • 尝试实例化 EntityManager 实例的代码位于 lib 目录(多项目 Maven 构建的一部分)的 JAR 文件中,但持久性 XML 位于主 Web 应用程序中,如上所述。
  • 我可以在 Tomcat 中看到 JNDI 数据源,我可以使用 psi-probe 查询它,即我可以访问连接信息并成功地对数据源执行 SQL 查询。

最佳答案

因为你使用可移植资源,你应该使用“java:comp/env/your_resource”调用你的 JNDI,比如 java:comp/env/jdbc/MyDB

关于java - 使用 persistence.xml 时将 Hibernate 4.0 与 Tomcat 7 结合使用时出现 JndiException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10800971/

相关文章:

spring - Spring Boot JPA 中的全文搜索

hibernate - 如何将此SQL转换为Grails Gorm条件查询

tomcat - alfresco/share 重定向到一个长站点 url?

java - 使用 Scala swing 的经验,它如何添加到 Java swing 中已经可用的内容?有什么挑战吗?

java - 如何对预期在小程序安全管理器中运行的 Java 代码进行单元测试

java - JTree 出现问题,它不显示

java - 如何使用 org.joda.time 设置时区?

swing - HikariCP 调试输出,这正常吗?

java - 无法启动嵌入式tomcat Spring boot

java - Java App 的加载问题 - 如何复制?