2012-05-29 29 views
5

Tôi đang sử dụng Hibernate 4.0 với tệp JPA persistence.xml trên Tomcat 7. Không có Struts, chỉ cần Hibernate thẳng với một số dịch vụ của Jersey. Đây là ngoại lệ mà tôi đang gặp phải:JndiException khi sử dụng Hibernate 4.0 với Tomcat 7 khi sử dụng persistence.xml

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 

Tôi thấy lưu ý về jbc không bị ràng buộc trong ngữ cảnh này, nhưng tôi nhầm lẫn là điều này xảy ra như thế nào. Tôi đang triển khai hoàn cảnh của tôi trong một context.xml ứng dụng cụ thể, dưới đây:

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

Và tập tin persistence.xml của tôi trông giống như:

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

Cuối cùng, tập tin web.xml của tôi có tài nguyên định nghĩa như vậy:

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

đối với bố trí của tôi, đây là cách tập chiến tranh của tôi được cấu trúc:

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

Một vài lưu ý nhỏ:

  • Sử dụng một bối cảnh toàn cầu so với một bối cảnh ứng dụng cụ thể làm cho không có sự khác biệt.
  • Mã cố gắng khởi tạo một cá thể EntityManager nằm trong tệp JAR trong thư mục lib (một phần của một dự án Maven nhiều dự án), nhưng XML bền vững nằm trong ứng dụng web chính như được nêu ở trên.
  • Tôi có thể xem nguồn dữ liệu JNDI trong Tomcat và tôi có thể truy vấn nó bằng cách sử dụng psi-probe, tức là tôi có thể truy cập thông tin kết nối và thực thi thành công truy vấn SQL đối với nguồn dữ liệu.
+1

persistence.xml của bạn có jdbc/AxonifyDB. Bạn cần phải ràng buộc đó như là một tài nguyên trong tệp context.xml của bạn. –

+0

Bah, lỗi chính tả về phía tôi. Tôi đã cố gắng làm xáo trộn các tập tin. :-) Tên tất cả đều khớp với nhau. –

+0

Có bất kỳ lỗi nào trong nhật ký Tomcat của bạn không? Bạn có thể nhìn cây jndi trong quản trị Tomcat của bạn không? Nếu vậy, bạn có thấy jdbc/MyDB không? –

Trả lời

5

Vì bạn sử dụng một nguồn tài nguyên di động với, bạn nên gọi JNDI của bạn sử dụng "java: comp/env/your_resource", như java: comp/env/jdbc/MyDB

+0

Cảm ơn, điều đó dường như đang hoạt động. Tôi nhận được một ngoại lệ khác ngay bây giờ, nhưng đó có thể là do một vấn đề cấu hình khác nhau. –

+2

Bản cập nhật nhanh cho những người có thể gặp phải vấn đề này. Điều này chỉ xảy ra nếu bạn đang sử dụng Tomcat <7.0.27. Nếu bạn sử dụng phiên bản 7.0.27 trở lên, chúng đã khắc phục sự cố tra cứu tài nguyên JNDI gây ra lỗi này. Đã cho tôi biết một ngày để tìm ra lý do tại sao máy của tôi hoạt động nhưng hộp Ubuntu 12.04 của tôi thì không. –

Các vấn đề liên quan