30

我想在 JBoss 7.1 中使用 hibernate 4.3 的多租户特性。

通过在 jboss-deployment-structure 中添加以下几行,我设法将它包含在我的战争中

<exclusions>
   <module name="org.hibernate" />
</exclusions>

并在我的 pom.xml 中添加对休眠核心和实体管理器的依赖项

这使得休眠 4.3 加载但不幸的是我得到了一个错误

java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

这是由于在休眠 4.3 使用 JPA 2.1 时加载了 JPA 2.0

我已经看过这些线程并尝试了他们的建议 Excluding JPA Subsystem from JBoss EAP 6.1 - Trying to use JPA 2.1 in JBoss EAP 6.1 , JBoss AS7 Automatically Loading JPA , Hibernate 4.3.0.Final & Spring Data JPA 1.4.3.RELEASE

我添加了一个persistence.xml

<property name="jboss.as.jpa.managed" value="false" /> 

从 Spring Data 中排除 hibernate jpa 2.0

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>${spring-data.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

从 JBoss Standalone.xml 中完全删除了 JPA 子系统,但没有任何成功。

正如另一个线程中所建议的那样,唯一能解决问题的是在 jboss-deployment-structure 中排除整个 javaee.api

<exclusions>
    <module name="javax.persistence.api"/>
    <module name="javaee.api"/>
</exclusions>

但这会给我的其余代码带来很多问题。

更新:我的 jboss-deployment-structure.xml 现在是这样的

<jboss-deployment-structure>
<deployment>
    <exclusions>
        <module name="org.slf4j" />
        <module name="org.slf4j.impl" />
        <module name="org.apache.log4j" />
        <module name="javax.persistence.api" />
        <module name="org.hibernate" />
    </exclusions>
    <dependencies>
        <module name="org.jboss.ironjacamar.jdbcadapters" />
        <module name="org.hornetq" />
        <module name="org.hornetq.ra" />
        <module name="org.jboss.ejb3" />
        <module name="org.jboss.ejb-client" />
    </dependencies>
</deployment>
</jboss-deployment-structure>

如您所见,我已经尝试了很多没有运气的事情,因此,如果有人有其他想法,非常欢迎。

4

4 回答 4

8

我会将这个问题分成两个较小的问题:

1)确保您不依赖于 JPA 2.0

为此,您可以使用依赖图可视化工具(NetBeans 内置了一个,或者您可以使用 maven 依赖树插件)。另一种方法是在部署到 JBoss 之前浏览包含在工件中的库。

2)确保正确配置 JBoss AS 7.1

JBoss AS 7.1 与 Hibernate 4.0.x jar 捆绑在一起,为了更新它们,请按照官方文档中的说明尝试这些步骤。

  • 更新当前as7/modules/org/hibernate/main文件夹以包含较新版本

  • as7/modules/org/hibernate/main删除和as7/modules/org/hibernate/envers/main文件夹中的 *.index 文件

  • 备份当前内容as7/modules/org/hibernate以防出错

  • 删除旧的 jar 并将新的 Hibernate jar 复制到as7/modules/org/hibernate/main+as7/modules/org/hibernate/envers/main

  • 更新as7/modules/org/hibernate/main/module.xml+as7/modules/org/hibernate/envers/main/module.xml以命名您复制的罐子

更新后as7/modules/org/hibernate/main/module.xml的样子(注意依赖关系不会改变):

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.hibernate">
    <resources>
        <resource-root path="hibernate-core-4.3.5.Final.jar"/>
        <resource-root path="hibernate-commons-annotations-4.0.4.Final.jar"/>
        <resource-root path="hibernate-entitymanager-4.3.5.Final.jar"/>
        <resource-root path="hibernate-infinispan-4.3.5.Final.jar"/>
    </resources>

    <dependencies>
       .
       .
    </dependencies>
</module>
于 2014-04-29T08:52:19.383 回答
3

尝试仅删除javax.persistence.api模块以及org.hibernate.

此外,如果您想为所有 Web 应用程序(应该向后兼容)切换到 Hibernate 4.3,请按照此处所述切换到更新版本的 Hibernate 。

一些调试提示:生成 JAR 文件后,明确检查它们包含哪些 JPA/Hibernate 库(通过解压缩它们)。此外,为了检查 Hibernate 版本,您可以像这里描述的那样进行操作。

还要检查jboss-deployment-structure 文件的结构,因为该<exclusions>元素似乎既不在 a 中<deployment>,也不在<sub-deployment>元素中。

于 2014-04-29T08:18:17.923 回答
0

对我们来说,以下帮助(仅适用于非容器管理的 JPA 场景!):

  1. IDE 端:(Eclipse Kepler)删除(在测试期间添加并忘记删除)(本地安装的)JBoss 7.1.1.Final Library项目构建路径依赖项

  2. Maven 方面:(mvn 3.0.4 和 3.3.3)我们的全局中对以下hibernate JPA 2.0 包括部分(它是/pom.xml一个带有/pom.xmlear/pom.xmlejb/pom.xmlweb/pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
        ...
    
        <dependencyManagement>
            <dependencies>
                ...
    
                <!-- outcommented because of JPA 2.1 support -->
                <!-- 
                <dependency>
                    <groupId>org.jboss.bom</groupId>
                    <artifactId>jboss-javaee-6.0-with-hibernate</artifactId>
                    <version>${version.jboss.bom}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                -->
            </dependencies>
        </dependencyManagement>
    
        ...
    
  3. Maven 端: 仅添加hibernate-entitymanager 4.3.8.Final和我们的数据库驱动程序(postgres)作为与 DB/ORM 相关的依赖项(也加载所有其他必需的库)在我们的/ejb/pom.xml

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.3-1102-jdbc41</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.8.Final</version>
    </dependency>
    
  4. 服务器端: 在我们的 JBoss 7.1.1.Final 全局禁用 JPA 2.0(适用于所有 webapps/libs,如果你有多个)设置<module name="javax.persistence.api" export="false"/>

提示:

于 2015-08-19T07:39:14.547 回答
-2

尝试使用较低版本的 hibernate-entitymanager

 <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.6.0.Final</version>
</dependency>

并且 jpa 2.0 可能会工作 > 它对我有用。

于 2015-12-19T18:22:56.107 回答