JndiException lors de l'utilisation d'Hibernate 4.0 avec Tomcat 7 lors de l'utilisation de persistence.xml

Je suis en utilisant Hibernate 4.0 avec une JPA persistence.xml fichier sur Tomcat 7. Pas de Jambes, tout droit Hibernate avec certains Maillot de services. Ici est l'exception, je suis en cours d'exécution dans:

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

Je vois la remarque à propos de jbc n'est pas lié dans ce contexte, mais je suis confus que la façon dont cela se passe. Je suis le déploiement de mes contexte dans une application spécifique context.xml ci-dessous:

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

Et mon persistence.xml fichier ressemble à ceci:

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

Enfin, mon web.xml fichier a de la ressource définie de la manière suivante:

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

Que pour ma mise en page, voici comment mon fichier war est structuré:

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

Quelques petites remarques:

  • À l'aide d'un contexte global par rapport à une application spécifique au contexte ne fait aucune différence.
  • Le code tente d'instancier un EntityManager instance est dans un fichier JAR dans le répertoire lib (partie d'un multi-projet Maven build), mais la persistance XML est la principale application web comme indiqué ci-dessus.
  • Je peux voir la datasource JNDI dans Tomcat et je peux faire des requêtes à l'aide de psi-sonde, c'est à dire je peux accéder aux informations de connexion et d'exécuter des requêtes SQL sur la source de données.
Votre persistence.xml a <non-jta-data-source>jdbc/AxonifyDB</...>. Vous devez lier que comme une ressource dans votre context.xml.
Bah, la faute d'orthographe de ma part. J'essayais de dissimuler les fichiers. 🙂 Les noms de tous les match en fait.
Existe-il des erreurs dans les logs de Tomcat? Pouvez-vous regarder l'arborescence jndi dans votre Tomcat admin? Si oui, voyez-vous jdbc/MyDB?
Selon psi-sonde, je peux voir la source de données, test de connexion et d'exécuter des requêtes SQL avec succès. Je reçois toujours des erreurs dans mon code hibernate où je ne peux pas créer mon gestionnaire d'entités.
Où voulez-vous créer votre EntityManager? Au printemps de xml? Que devrait prendre une connexion db pointant vers votre jndi de la connexion de base, à l'aide d'une session de l'usine.

OriginalL'auteur John S | 2012-05-29