2011-09-01 61 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>