2012-05-29 21 views
5

Estoy usando Hibernate 4.0 con un archivo JPA persistence.xml en Tomcat 7. No Struts, solo Hibernate directamente con algunos servicios de Jersey. Aquí es la excepción que estoy corriendo en:JndiException al usar Hibernate 4.0 con Tomcat 7 al usar persistence.xml

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 

veo la nota sobre JBC no está obligado en este contexto, pero estoy confundida como la forma en que esto está sucediendo. Estoy desplegando mi contexto en una context.xml aplicación específica, a continuación:

<?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> 

Y mi archivo persistence.xml parece:

<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> 

Por último, mi archivo web.xml tiene el recurso por lo define como:

<!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> 

en cuanto a mi disposición, aquí es cómo mi archivo de la guerra se estructura:

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

Unas notas menores:

  • Uso de un contexto global frente a un contexto específico de la aplicación no hace ninguna diferencia.
  • El código que intenta crear una instancia de EntityManager está en un archivo JAR en el directorio lib (parte de una compilación de Maven multiproyecto), pero el XML de persistencia está en la aplicación web principal como se describe anteriormente.
  • Puedo ver el origen de datos JNDI en Tomcat y puedo consultarlo usando psi-probe, es decir, puedo acceder a la información de conexión y ejecutar con éxito consultas SQL contra el origen de datos.
+1

Su persistence.xml tiene jdbc/AxonifyDB. Debe vincular eso como un recurso en su context.xml. –

+0

Bah, error ortográfico de mi parte. Intentaba ofuscar los archivos. :-) Los nombres coinciden en realidad. –

+0

¿Hay algún error en los registros de Tomcat? ¿Puedes mirar el árbol de jndi en tu administrador de Tomcat? Si es así, ¿ves jdbc/MyDB? –

Respuesta

5

Puesto que se utiliza un recurso portátil con, debe llamar a su JNDI utilizando "java: comp/env/your_resource", como java: comp/env/jdbc/MyDB

+0

Gracias, eso parece estar funcionando. Ahora recibo una excepción diferente, pero puede deberse a un problema de configuración diferente. –

+2

Una actualización rápida para quienes puedan tropezar con este problema. Esto solo ocurre si está usando Tomcat <7.0.27. Si usa 7.0.27 o posterior, han solucionado un problema de búsqueda de recursos JNDI que causa este error. Me tomó alrededor de un día averiguar por qué mi máquina estaba funcionando pero mis cajas Ubuntu 12.04 no. –

Cuestiones relacionadas