2011-09-01 101 views
5

當我嘗試在我的EAR自帶的Hibernate版本(而不是默認的JBoss帶來的版本)中發佈時,我很難。在JBOSS中升級休眠版本

然後,我做出部署「作用域」通過在耳朵上的jboss-app.xml文件包含以下內容:

<jboss-app> 
    <loader-repository> 
    com.example:archive=unique-archive-name 
    <loader-repository-config> 
    java2ParentDelegation=false 
    </loader-repository-config> 
    </loader-repository> 
</jboss-app> 

,和往常一樣,我宣佈在持久單元我的持久性提供休眠,如下:

<persistence> 
    <persistence-unit name="myapp"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    ... 

但是,最糟糕的事情發生了。在部署時,服務器在嘗試從org.hibernate.ejb.HibernatePersistence強制轉換爲JPA接口javax.persistence.spi.PersistenceProvider(它由HibernatePersistence實現)時拋出ClassCastException。

這是一種WEIRD,因爲我在我的EAR中發佈了JPA API,所以,如果EAR的類優先於JBoss的類,那麼從HibernatePersistence投射到PersistenceProvider時應該沒有問題,因爲它們「應該」在同一個類加載器上。

如果我沒有發佈我自己的JPA API,那麼當JBoss嘗試查找某些JPA類時,部署將失敗,並顯示ClassNotFoundException。

任何想法爲什麼這個演員失敗?

我正在使用JBoss 5.1.0,並嘗試使用Hibernate 3.5.6.Final。 JPA API版本是由經過修改的Hibernate版本傳入的版本。

回答

1

你是否也包含了hibernate-entitymanager.jar?

否則,您可以嘗試用3.5.6版本替換common/lib中的hibernate核心jar。

+0

謝謝。是的,hibernate-core和hibernate-entitymanager都已發貨。要將hibernate jar放在common/lib中不是一個選項,應該發佈Hibernate(並且應該可以...)。 – edutesoy

2

您可以嘗試通過耳朵部署者開啓課程範圍。對於JBoss 5.x的編輯:

的JBoss /服務器/ [配置] /deployers/ear-deployer-jboss-beans.xml

和變化:

<bean name="EARClassLoaderDeployer" class="org.jboss.deployment.EarClassLoaderDeployer"> 
     <property name="isolated">false</property> 
    </bean> 

設置分離爲true。

1

爲了解決jboss服務器中的休眠類加載問題,您需要在您的Web應用程序的WEB-INF文件夾中添加jboss-classloading.xml閱讀更多關於這些配置設置here

<classloading xmlns="urn:jboss:classloading:1.0" 
domain="pentaho.ear" 
export-all="NON_EMPTY" 
import-all="true" 
parent-first="false"> 
</classloading>