2012-05-29 15 views
5

Tomcat 7でJPA persistence.xmlファイルを使用しているHibernate 4.0を使用しています。ここで私はに実行している例外である:私はJBCについての注意事項は、このコンテキストでバインドされていない参照persistence.xmlを使用するときにTomcat 7でHibernate 4.0を使用すると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 

が、私はどのようにこれが起こっているように混乱しています。最後に、私のweb.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> 

:私は、アプリケーション固有の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ファイルは次のようになりますそのように定義:私のレイアウトについては

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

、ここに私のwarファイルが構造化されてどのようである:

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

あなたとポータブルリソースを使用するので、あなたが "で、java:comp/env/your_resource" を使用してJNDIを呼び出す必要があり、Javaのような:コンプ/ ENV/JDBC/mydbという

+0

ありがとう、それは働いているようです。今は別の例外が発生していますが、これは別の設定の問題が原因である可能性があります。 –

+2

この問題でつまずく可能性のあるユーザーのためのクイックアップデート。これはTomcat <7.0.27を使用している場合にのみ発生します。 7.0.27以降を使用している場合、このエラーの原因となるJNDIリソース参照に問題が修正されています。なぜ私のマシンが動作していたのか分かりませんが、私のUbuntu 12.04のボックスはありませんでした。 –

関連する問題