web-dev-qa-db-ja.com

hibernate 4.3を使用するには、JBoss 7.1からJPA 2.0を除外します

JBoss 7.1のマルチテナンシー機能にhibernate 4.3を使用します。

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がロードされるためです。

これらのスレッドを見て、それらが示唆することを試しました JBoss EAP 6.1からJPAサブシステムを除外-JBoss EAP 6.1でJPA 2.1を使用しようとしていますJBoss AS7自動ロード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>

お分かりのように、私は運のない多くのことを試しましたので、誰かが別のアイデアを持っているなら、それは大歓迎です。

29
andreadi

この問題を2つの小さな問題に分割します。

1)JPA 2.0に過渡的に依存していないことを確認してください

このために、依存関係グラフ視覚化ツールを使用できます(NetBeansには組み込みツールがあります。または、Maven依存関係ツリープラグインを使用できます)。もう1つの方法は、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/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を更新して、コピーしたjarに名前を付けます

更新された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>
8
hovanessyan

javax.persistence.apiとともにorg.hibernateモジュールのみを削除してみてください。

また、すべてのWebアプリケーション(下位互換性が必要)でHibernate 4.3に切り替える場合は、 here の説明に従って、Hibernateの新しいバージョンに切り替えます。

デバッグのヒント:JARファイルを生成した後、それらに含まれるJPA/Hibernateライブラリを明示的に確認します(解凍して)。また、Hibernateバージョンを確認するために、それを行うことができます ここで説明されているように

<exclusions>要素が<deployment>にも<sub-deployment>要素にもないように見えるため、 jboss-deployment-structure file の構造も確認してください。 。

3
Andrei I

私たちにとっては、以下が役立ちました(はコンテナ管理されていないJPAシナリオでのみ動作します!):

  1. IDE-side:(Eclipse Kepler)削除(テスト中に追加され、削除するのを忘れた)JBoss 7.1.1。最終ライブラリプロジェクトビルドパス依存関係

  2. Maven-side:(mvn 3.0.4および3.3.3)outcommented次のhibernate JPA 2.0を含むセクショングローバル/pom.xml/pom.xmlear/pom.xmlejb/pom.xmlおよびweb/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-side:追加のみhibernate-entitymanager 4.3.8.FinalおよびDBドライバー(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"/>

ヒント:

0