2013-11-22 3 views
6

Mam problem z uaktualnieniem do wersji Hibrernate 4.3.x z wersji 4.2.7. Mam ten wyjątek:Hibernate 4.3 + Tomcat 7 Nie można wyszukać nazwy JNDI

Caused by: javax.naming.NameNotFoundException: Name [java:comp/env/jdbc/data] is not bound in this Context. Unable to find [java:comp]. 
at org.apache.naming.NamingContext.lookup(NamingContext.java:820) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at javax.naming.InitialContext.lookup(InitialContext.java:415) 
at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:114) 
... 82 more 

Używam Tomcat 7.0.29 (wypróbowany 7.0.47) i JDK 7 (v25). Nie ma problemu z Hibernate 4.2.7.

Oto moja persistence.xml:

<persistence-unit name="data" transaction-type="RESOURCE_LOCAL"> 
    <non-jta-data-source>java:comp/env/jdbc/data</non-jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.show_sql" value="false" /> 
     <property name="hibernate.format_sql" value="true" /> 
    </properties> 
</persistence-unit> 

Ale nie sądzę, że problem jest tutaj. Zrobiłem trochę badań diagnostycznych i dowiedziałem się, że:

JndiServiceImpl#locate(String jndiName) tworzy kontekst początkowy, który jest inny.

4.3.0 - org.apache.naming.NamingContext

4.2.7 - org.apache.naming.SelectorContext

wyjątkiem tego, że nie można znaleźć żadnych więcej różnic.

Znalazłem kilka podobnych tematów dla tego problemu, ale nic z pomocy. Dzięki za pomoc.

+0

Czy zdefiniowałeś jakiekolwiek źródło danych w pliku server.xml? –

+1

Nie, nie zrobiłem tego. Czy powinienem? Nigdy nie zdefiniowałem żadnego DS w pliku server.xml. – vernjan

+0

Ktoś wysłał raport o błędzie tutaj: https://hibernate.atlassian.net/browse/HHH-8818 –

Odpowiedz

0

Tak, to jest rzeczywiście błędne, ponieważ skupili się na tym, jak działa session-factory i kiedy fabryka jest proszona o połączenie.

Musisz więc rozwiązać problem za session-factory, aby go użyć, gdy session-factory zażąda nowego połączenia.

Spróbuj rozwiązać DataSource w JNDI w jedynego respolsibility z hibernacji przez starego scool hibernate.cfg.xml tak:

<hibernate-configuration> 
    <session-factory name="data"> 
     <property name="connection.datasource">java:comp/env/jdbc/data</property> 
    ... 

i rozwiązać config poprzez persistence.xml jak ten:

<persistence version="2.0"> 
    <persistence-unit name="data"> 
     <properties> 
      <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/> 

Maybe twoje hbm2ddl musi też przejść do hibernate.cfg.xml.

Baw się dobrze.