2014-03-04 1 views
2

많은 사용자가 동일한 문제에 직면 해있는 것 같지만 현재는 이미 제시된 제안이 나와 함께 작동하지 않는다는 점을 고려하여 직접 문제를 게시해야합니다. 아니면 내가 놓친 것일까 요? web.xml에서persistence.xml 파일의 JNDI 리소스를 호출 할 수 없습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource name="jdbc/BrassDB" auth="Container" type="javax.sql.DataSource" 
       driverClassName="org.postgresql.Driver" 
       url="jdbc:postgresql://localhost:5432/mydb" username="usr" password="pwd" 
       maxActive="20" maxIdle="10" maxWait="-1"/> 
</Context> 

: 나는 또한 context.xml 파일이 resources/META-INF에서

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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 "> 
    <persistence-unit name="brass-unit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <properties> 
       <property name="hibernate.connection.datasource" value="java:/comp/env/jdbc/BrassDB"/> 
    </properties> 
</persistence-unit> 

: 여기

persistence.xml 파일 (메이븐 프로젝트에 위치한 Uner에 resources/META-INF/ 디렉토리)입니다 내가 갖고있는 파일 :

web.xml 파일에
<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
<display-name>brass_directory_business</display-name> 
<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
</welcome-file-list> 
<resource-ref> 
    <description>db connection</description> 
    <res-ref-name>jdbc/BrassDB</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

참고 : 가끔 resource-ref 태그,하지만 같은 행동의 결과를 댓글을 달았습니다.

내가 이것을 실행하면 이제 내 서블릿에서, 모든 것이 잘 작동 :

InitialContext ctx = null; 
try { 
    ctx = new InitialContext(); 
    if (ctx == null) { 
     throw new Exception("no context!"); 
    } 
    DataSource ds = (DataSource)ctx.lookup("java:/comp/env/jdbc/BrassDB"); 
    if (ds == null) { 
     throw new Exception("data source not found!"); 
    } 
    Connection conn = ds.getConnection(); 
    ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM person"); 
    int n = 0; 
    while (rs.next()) { 
     n++; 
    } 
    System.out.println("rs length is: " + n); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

하지만이 실행할 때 :

EntityManagerFactory emf = Persistence.createEntityManagerFactory("brass-unit"); 
EntityManager em = emf.createEntityManager();  
em.createNamedQuery("Person.findAll", Person.class).getResultList(); 

내가 얻을이 예외 :

Mar 04, 2014 4:48:56 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [com.banco.Test] in context with path [/brass_directory_business] threw exception 
javax.persistence.PersistenceException: Unable to build entity manager factory 
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:81) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) 
    at com.banco.Test.doPost(Test.java:34) 
    at com.banco.Test.doGet(Test.java:27) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: org.hibernate.engine.jndi.JndiException: Unable to lookup JNDI name [java:/comp/env/jdbc/BrassDB] 
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:117) 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178) 
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) 
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:73) 
    ... 26 more 
Caused by: javax.naming.NameNotFoundException: Name [java:/comp/env/jdbc/BrassDB] is not bound in this Context. Unable to find [java:]. 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:819) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153) 
    at javax.naming.InitialContext.lookup(InitialContext.java:415) 
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:114) 
    ... 42 more 

pom.xml 모양 :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    //...... 
    <dependencies> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>4.3.1.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>4.3.1.Final</version> 
     </dependency> 
     //... 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
     //... 
      </plugin> 
     </plugins> 
    </build> 
</project> 

서버로 tomcat 7.0.52를 사용하고 있습니다. 누구든지 내 문제를 해결하는 방법에 대한 제안이 있습니까?

답변

1

저에게이 문제는 최대 절전 모드 문제인 것처럼 보입니다. 난 그냥 최대 절전 모드 4.2.7로 변경하고, 잘 작동합니다.

1

나는 다른 생각을 가지고 : 당신의 persistence.xml에

1.Add <exclude-unlisted-classes>false</exclude-unlisted-classes>, <persistence-unit> elemet

2.Add 귀하의 persistence.xml에 따라 <persistence-unit>/<properties> 요소 :

<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> 
<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:standalone"/> 
<property name="javax.persistence.jdbc.user" value="sa"/> 
<property name="javax.persistence.jdbc.password" value=""/> 

게다가, pom.xml에서 hibernate-core 종속성을 제거하십시오.

이제 entitymanager를 사용할 수 있습니다. JDBC 연결이 필요하면 EntityManager 인스턴스에서 가져옵니다 (JNDI로 가져온 방식이 아닙니다).

+0

'JDBC' 연결이 아니라'DataSource'로 지정하고 싶습니다. 어쨌든, 당신이 볼 수 있듯이, 이것은 내가 사용하는 버전에서 최대 절전 모드 문제입니다. – artaxerxe

관련 문제