JndiException при использовании Hibernate 4.0 с Tomcat 7 при использовании persistence.xml

Я использую Hibernate 4.0 с файлом JPA persistence.xml в Tomcat 7. Нет Struts, просто прямой 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>

Что касается моего макета, то вот как структурирован мой военный файл

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

Несколько небольших заметок:

Using a global context versus an application-specific context makes no difference. The code trying to instantiate an EntityManager instance is in a JAR file in the lib directory (part of a multi-project Maven build), but the persistence XML is in the main web app as outlined above. I can see the JNDI datasource in Tomcat and I can query it using psi-probe, i.e. I can access the connection information and successfully execute SQL queries against the data source.
 Todd Murray29 мая 2012 г., 17:16
Есть ли ошибки в ваших журналах Tomcat? Можете ли вы посмотреть на дерево jndi в вашем администраторе Tomcat? Если это так, вы видите jdbc / MyDB?
 John S29 мая 2012 г., 17:01
Бах, орфографическая ошибка с моей стороны. Я пытался запутать файлы. :-) На самом деле все имена совпадают.
 John S29 мая 2012 г., 18:59
В соответствии сpsi-probeЯ могу увидеть источник данных, проверить соединение и успешно выполнить некоторые операторы SQL. Я все еще получаю ошибки в своем коде гибернации, где я не могу создать свой менеджер сущностей.
 Todd Murray29 мая 2012 г., 19:46
Где вы создаете свой EntityManager? В весенний xml? Это должно занять соединение db, указывающее на базовое соединение jndi, с использованием фабрики сеансов.
 Todd Murray29 мая 2012 г., 16:21
Ваш файл persistence.xml имеет & lt; источник не-jta-данных & gt; jdbc / AxonifyDB & lt; /...& gt ;. Вы должны связать это как ресурс в вашем context.xml.

Ответы на вопрос(1)

Решение Вопроса

вы должны вызывать свой JNDI с помощью & quot; java: comp / env / your_resource & quot ;, например, java: comp / env / jdbc / MyDB

 John S01 июн. 2012 г., 19:57
Быстрое обновление для тех, кто может наткнуться на эту проблему. Это происходит только в том случае, если вы используете Tomcat & lt; 7.0.27. Если вы используете 7.0.27 или более позднюю версию, они устранили проблему для поиска ресурсов JNDI, которая вызывает эту ошибку. У меня ушло около дня, чтобы выяснить, почему моя машина работала, а мои Ubuntu 12.04 не работали.
 John S30 мая 2012 г., 22:16
Спасибо, похоже, работает. Сейчас я получаю другое исключение, но это может быть связано с другой проблемой конфигурации.

Ваш ответ на вопрос