0

我正在进行 Arquillian 测试。主题是一个使用 Hibernate 3 的 EJB,我将其与所有其他 Maven 依赖项一起添加到压缩包中。它将 EJB 作为包装在 EAR 中的 JAR 部署到嵌入了 Hibernate 4 的嵌入式 JBOSS 7。它与以下异常发生冲突:

java.lang.AbstractMethodError: org/hibernate/usertype/UserType.nullSafeSet(
    Ljava/sql/PreparedStatement;Ljava/lang/Object;
    ILorg/hibernate/engine/spi/SessionImplementor;)V

我坚信我的代码(针对 Hibernate 3 编译)是针对 Hibernate 4 执行的,因此会出现错误。我的理解是 JBOSS 默认先做父母,这可以解释错误。我打印出归档内容作为收缩包装的一部分,所以我相信我知道 Hibernate 3 在 EAR 中。

我试过最后将 JBOSS 更改为父级,但没有成功。其中一些可能很愚蠢,但我还是尝试了它们:

  1. 添加了一个META-INF/jboss-classloading.xml(到 JAREAR)

  2. 添加了一个META-INF/jboss-deployment-structure.xml(到 JAREAR)以尝试排除父 Hibernate:

  3. 从 JBOSS 中删除 Hibernate JAR - 这完全破坏了服务器

以下是我的设置的一些配置方面:

  • 依赖项:
    • org.hibernate:hibernate-annotations:jar:3.4.0.GA:provided
    • org.hibernate:hibernate-core:jar:3.3.2.GA:provided
    • org.jboss.arquillian.junit:arquillian-junit-container:jar:1.1.1.Final:test
    • org.jboss.arquillian.protocol:arquillian-protocol-servlet:jar:1.1.1.Final:test
    • org.jboss.as:jboss-as-arquillian-container-managed:jar:7.1.1.Final:provided
    • org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:jar:2.0.0:test
    • org.jboss.spec:jboss-javaee-web-6.0:pom:3.0.0.Final:provided
  • 指向一个解压的jboss-as-7.1.1.Final
  • META-INF/arquillian.xml

    <arquillian ...>
        <defaultProtocol type="Servlet 3.0" />
        <container qualifier="jbossas-managed" default="true">
            <configuration>
            ...
            </configuration>
        </container>
    </arquillian>
    
  • META-INF/application.xml

    <application ...
       version="5">
       <module><ejb>test.jar</ejb></module>
    </application>
    

还要别的吗?:)

非常感谢您的帮助!

4

1 回答 1

1

由于您在应用程序中打包 Hibernate 3,因此您应该在 persistence.xml 文件中指定JPA 提供程序hibernate3-bundled。请注意,您当前的 Hibernate 3.x 版本可能无法正常工作,您可能需要将其升级到 >= 3.5。

或者最好使用容器提供的 Hibernate 4 JPA 提供程序,除非您有理由使用 Hibernate 3。

于 2013-09-13T00:04:09.180 回答