2012-05-29 21 views
5

Sto utilizzando Hibernate 4.0 con un file persistence.xml JPA su Tomcat 7. Nessun puntamento, semplicemente Hibernate dritto con alcuni servizi di Jersey. Qui è l'eccezione che sto funzionando in:JndiException quando si utilizza Hibernate 4.0 con Tomcat 7 quando si utilizza 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 

vedo la nota su JBC non è vincolata in questo contesto, ma sono confuso come questo sta accadendo. Sto distribuzione mio contesto in un context.xml specifica per l'applicazione, di seguito:

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

E il mio file persistence.xml assomiglia:

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

Infine, il mio file web.xml ha la risorsa definito come così:

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

per quanto riguarda il mio layout, ecco come il mio file di guerra è strutturato:

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

Alcune note minori:

  • Utilizzando un contesto globale rispetto a un contesto specifico dell'applicazione non fa alcuna differenza.
  • Il codice che tenta di creare un'istanza di EntityManager si trova in un file JAR nella directory lib (parte di un build Maven multi-progetto), ma l'XML di persistenza si trova nell'applicazione Web principale come descritto sopra.
  • Posso vedere l'origine dati JNDI in Tomcat e posso interrogarlo utilizzando psi-probe, ad esempio posso accedere alle informazioni di connessione ed eseguire correttamente query SQL sull'origine dati.
+1

tuo persistence.xml ha jdbc/AxonifyDB. Devi collegarlo come risorsa nel tuo context.xml. –

+0

Bah, errore di spelling da parte mia. Stavo cercando di offuscare i file. :-) I nomi corrispondono tutti in realtà. –

+0

Ci sono errori nei log di Tomcat? Riesci a guardare l'albero jndi nel tuo amministratore Tomcat? Se sì, vedi jdbc/MyDB? –

risposta

5

Dal momento che si utilizza una risorsa portatile con, si dovrebbe chiamare il JNDI utilizzando "java: comp/env/your_resource", come java: comp/env/jdbc/MyDB

+0

Grazie, sembra funzionare. Ora ricevo un'eccezione diversa, ma potrebbe essere dovuto a un problema di configurazione diverso. –

+2

Un rapido aggiornamento per coloro che potrebbero incappare in questo problema. Ciò si verifica solo se si utilizza Tomcat <7.0.27. Se si utilizza 7.0.27 o versione successiva, è stato risolto un problema per le ricerche di risorse JNDI che causano questo errore. Mi ci è voluto un giorno per capire perché la mia macchina funzionava, ma le mie caselle di Ubuntu 12.04 non lo erano. –

Problemi correlati