Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用persistence.xml时将Hibernate 4.0与Tomcat 7一起使用时出现JndiException_Java_Hibernate_Tomcat_Jpa_Jndi - Fatal编程技术网

Java 在使用persistence.xml时将Hibernate 4.0与Tomcat 7一起使用时出现JndiException

Java 在使用persistence.xml时将Hibernate 4.0与Tomcat 7一起使用时出现JndiException,java,hibernate,tomcat,jpa,jndi,Java,Hibernate,Tomcat,Jpa,Jndi,我正在Tomcat7上使用Hibernate4.0和JPA persistence.xml文件。没有Struts,只是通过一些Jersey服务直接休眠。以下是我遇到的一个例外: Caused by: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [jdbc/MyDB] at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(Jnd

我正在Tomcat7上使用Hibernate4.0和JPA persistence.xml文件。没有Struts,只是通过一些Jersey服务直接休眠。以下是我遇到的一个例外:

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
一些小提示:

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

既然您使用的是可移植资源,那么应该使用“java:comp/env/your_resource”调用JNDI,比如java:comp/env/jdbc/MyDB

您的persistence.xml有jdbc/AxonifyDB。您需要将其作为资源绑定到context.xml.Bah中,这是我的拼写错误。我试图混淆文件。:-)实际上所有的名字都匹配。你的Tomcat日志中有错误吗?你能看看Tomcat管理员中的jndi树吗?如果是这样,您看到jdbc/MyDB了吗?根据,我可以看到数据源,测试连接并成功执行一些SQL语句。我的hibernate代码中仍然存在错误,无法创建实体管理器。您在哪里创建实体管理器?在SpringXML中?这应该需要一个指向jndi基连接的db连接,使用会话工厂。谢谢,这看起来很有效。我现在得到一个不同的异常,但这可能是由于一个不同的配置问题。对于可能遇到此问题的人,请快速更新。只有在使用Tomcat<7.0.27时才会发生这种情况。如果您使用7.0.27或更高版本,他们已经修复了导致此错误的JNDI资源查找问题。我花了大约一天的时间才弄明白为什么我的机器能工作,但我的Ubuntu 12.04盒子却不能。
<?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 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>
<!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>
app.war
    + META-INF
        - context.xml
    + WEB-INF
        + classes
            + META-INF
                - persistence.xml
        + lib
        - web.xml