使用persistence.xml时将Hibernate 4.0与Tomcat 7一起使用时出现JndiException
我在Tomcat 7上使用Hibernate 4.0和JPA persistence.xml文件。没有Struts,只是直接使用一些Jersey服务的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 ...
至于我的布局,这里是我的war文件的结构:
app.war + META-INF - context.xml + WEB-INF + classes + META-INF - persistence.xml + lib - web.xml
一些小调:
- 使用全局上下文与特定于应用程序的上下文没有区别。
- 尝试实例化EntityManager实例的代码位于lib目录中的JAR文件中(多项目Maven构建的一部分),但持久性XML位于主Web应用程序中,如上所述。
- 我可以在Tomcat中看到JNDI数据源,我可以使用psi-probe查询它,即我可以访问连接信息并成功执行针对数据源的SQL查询。
由于你使用了一个可移植资源,你应该使用“java:comp / env / your_resource”调用你的JNDI,比如java:comp / env / jdbc / MyDB
- 如何配置Hibernate,Spring和Apache dbcp用于连接池?
- 通过JPA随机选择行
- Java Hibernate与SQL Server 2012无法正常工作?
- 在持久化Hibernate之前自动设置bean值(列)?
- 使用Hibernate Criteria和Oracle,有什么更好的方法与时间一起工作?
- @BatchSize但在@ManyToOne案例中有很多往返
- 使用TIMESTAMPDIFF的JPA Hibernate公式中的SQL Literal
- org.hibernate.QueryException:JPA样式的位置参数不是一个完整的序数
- 如何使用Hibernate Validator动态解析消息参数?