2012-05-29 70 views
5

我在Tomcat 7上使用Hibernate 4.0和JPA persistence.xml文件。沒有Struts,只是直接使用Hibernate和一些Jersey服務。這是我遇到的異常:當使用Hibernate 4.0和Tomcat 7時使用persistence.xml時JndiException

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 

一些小筆記:

  • 利用全球範圍內對特定應用的背景下沒什麼區別。
  • 試圖實例化EntityManager實例的代碼位於lib目錄(多項目Maven構建的一部分)中的JAR文件中,但持久性XML位於上述主Web應用程序中。
  • 我可以看到Tomcat中的JNDI數據源,我可以使用psi-probe來查詢它,即我可以訪問連接信息併成功地對數據源執行SQL查詢。
+1

你的persistence.xml有<非-jta-data-source> jdbc/AxonifyDB。您需要將它作爲context.xml中的資源進行綁定。 –

+0

Bah,我的部分拼寫錯誤。我試圖混淆文件。 :-)這些名字實際上都匹配。 –

+0

Tomcat日誌中是否有錯誤?你可以看看你的Tomcat管理員中的jndi樹嗎?如果是這樣,你是否看到jdbc/MyDB? –

回答

5

由於您使用的便攜與資源,你應該使用打電話給你的JNDI的 「java:comp/env的/ your_resource」,像java:comp/env的/ JDBC/mydb的

+0

謝謝,這似乎是工作。我現在得到了一個不同的異常,但這可能是由於不同的配置問題。 –

+2

針對可能會遇到此問題的人員的快速更新。這隻有在使用Tomcat <7.0.27時纔會發生。如果您使用7.0.27或更高版本,它們已解決導致此錯誤的JNDI資源查找問題。花了我一天的時間弄清楚爲什麼我的機器正在工作,但我的Ubuntu 12.04盒子沒有。 –

相關問題