2013-11-22 60 views
6

我無法從4.2.7升級到Hibrernate 4.3.x。我得到這個例外:Hibernate 4.3 + Tomcat 7無法查找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 

我使用Tomcat 7.0.29(試用7.0.47以及)和JDK 7(v25)。 Hibernate 4.2.7沒有問題。

這裏是我的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> 

但我不認爲這個問題是在這裏。我做了一些調試研究,發現如下:

JndiServiceImpl#locate(String jndiName)創建一個不同的初始上下文。

4.3.0 - org.apache.naming.NamingContext

4.2.7 - org.apache.naming.SelectorContext

除此之外,我找不到任何更多的差異。

我發現這個問題有些類似的話題,但沒有任何幫助。謝謝你的幫助。

+0

您是否在server.xml中定義了任何數據源? –

+1

不,我沒有。我是不是該?我從來沒有在server.xml中定義任何DS。 – vernjan

+0

有人在這裏發佈了一個bug報告:https://hibernate.atlassian.net/browse/HHH-8818 –

回答

0

是的,它實際上是越野車,因爲他們不同地關注session-factory的工作方式以及工廠被要求連接的時間。

因此,當session-factory請求重新連接時,您需要在session-factory後面解析它以使用它。

試圖解決在休眠的唯一respolsibility JNDI數據源,通過老scool hibernate.cfg.xml這樣的:

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

,並通過persistence.xml這樣解決的配置:

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

也許那麼你的hbm2ddl也必須移動到hibernate.cfg.xml

玩得開心。