从JBoss 7.1中排除JPA 2.0以使用hibernate 4.3

时间:2014-04-25 13:24:52

标签: hibernate jpa-2.0 jboss7.x jpa-2.1

我想将hibernate 4.3用于JBoss 7.1中的多租户功能。

我设法通过在jboss-deployment-structure

中添加以下行来将它包含在我的战争中
<exclusions>
   <module name="org.hibernate" />
</exclusions>

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

这使得hibernate 4.3加载但不幸的是我收到了错误

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

这是由于在hibernate 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.1JBoss AS7 Automatically Loading JPAHibernate 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>

如你所见,我已经尝试了很多没有运气的事情,所以如果有人有另一个想法,那就非常受欢迎了。

3 个答案:

答案 0 :(得分:8)

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

1)确保您不能过渡,具体取决于JPA 2.0

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

2)确保正确配置JBoss AS 7.1

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

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

  • 删除as7/modules/org/hibernate/mainas7/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>

答案 1 :(得分:3)

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

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

一些调试技巧:生成JAR文件后,明确检查它们包含的JPA / Hibernate库(通过解压缩)。另外,为了检查Hibernate版本,你可以like it is here described

同时检查jboss-deployment-structure file的结构,因为似乎<exclusions>元素既不在<deployment>中,也不在<sub-deployment>元素中。

答案 2 :(得分:0)

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

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

  2. Maven-side:(mvn 3.0.4和3.3.3)取消评估以下 hibernate JPA 2.0包括 /pom.xml (<{1}},/pom.xmlear/pom.xml的耳朵项目中的 部分 }和ejb/pom.xml

    web/pom.xml
  3. Maven-side: 仅添加 hibernate-entitymanager 4.3.8.Final 和我们的db驱动程序(postgres)作为DB / ORM相关我们的 <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> ...

    中的依赖项(它还会加载所有其他必需的库)
    /ejb/pom.xml
  4. 服务器端: 在全局JBoss 7.1.1.Final中禁用JPA 2.0 (对于所有webapps / libs,如果您有多个)设置<强> <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>

  5. 提示: