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.(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, специфичном для приложения, ниже:



    

И мой файл persistence.xml выглядит так:



    
        org.hibernate.ejb.HibernatePersistence
        jdbc/MyDB
        ...
        
            
            
            
        
    

Наконец, мой файл web.xml имеет ресурс, определенный следующим образом:




    My Web Application
    
        DB Connection
        jdbc/MyDB
        javax.sql.DataSource
        Container
    
...

Как для моего макета вот как структурирован мой военный файл:

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

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

  • Использование глобального контекста по сравнению с контекстом, специфичным для приложения, не имеет значения.
  • Код, пытающийся создать экземпляр EntityManager, находится в файле JAR в каталоге lib (часть многопроектной сборки Maven), но сохраняемый XML-код находится в основном веб-приложении, как указано выше.
  • Я вижу источник данных JNDI в Tomcat и могу запросить его с помощью psi-probe, т. е. я могу получить доступ к информации о подключении и успешно выполнить SQL-запросы к источнику данных.

5
задан John S 29 May 2012 в 17:27
поделиться