web-dev-qa-db-de.com

Schließen Sie JPA 2.0 von JBoss 7.1 aus, um den Ruhezustand 4.3 zu verwenden

Ich möchte Hibernate 4.3 für seine Multitenancy-Funktionen in JBoss 7.1 verwenden.

Ich habe es geschafft, es in meinen Krieg aufzunehmen, indem ich die folgenden Zeilen in die Jboss-Deployment-Struktur einfügte

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

und Hinzufügen einer Abhängigkeit für den Ruhezustand von Core und Entity Manager in meiner pom.xml

Dies machte den Ruhezustand 4.3 zum Laden, aber leider bekam ich einen Fehler 

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

dies liegt daran, dass JPA 2.0 geladen wird, wenn der Ruhezustand 4.3 JPA 2.1 verwendet

Ich habe diese Threads gesehen und ausprobiert, was sie vorschlagen Ohne JPA-Subsystem von JBoss EAP 6.1 - Versuch, JPA 2.1 in JBoss EAP 6.1 zu verwenden , JBoss AS7 JPA automatisch laden , Hibernate 4.3. 0.Final & Spring Data JPA 1.4.3.RELEASE .

Ich habe eine persistence.xml mit hinzugefügt 

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

ruhezustand für jpa 2.0 von Spring Data ausgeschlossen

<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>

JPA-Subsystem wurde vollständig aus JBoss Standalone.xml entfernt, jedoch ohne Erfolg.

Das einzige, was den Trick bewirkte, war, die gesamte javaee.api in der Jboss-Deployment-Struktur auszuschließen, wie in einem anderen Thread vorgeschlagen

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

dies verursacht jedoch viele Probleme mit dem Rest meines Codes.

UPDATE: Meine jboss-deploy-structure.xml ist jetzt so

<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>

Wie Sie sehen, habe ich viele Dinge ohne Glück ausprobiert. Wenn also jemand eine andere Idee hat, ist das sehr willkommen.

29
andreadi

Ich würde dieses Problem in zwei kleinere aufteilen:

1) Stellen Sie sicher, dass Sie nicht von JPA 2.0 abhängig sind

Hierfür können Sie das Visualisierungswerkzeug für Abhängigkeitsgraphen verwenden (in NetBeans ist eines integriert, oder Sie können ein Plugin für Maven-Abhängigkeitsstrukturen verwenden.) Eine andere Möglichkeit wäre, die in Ihrem Artefakt enthaltenen Bibliotheken zu durchblättern, bevor Sie sie in JBoss bereitstellen.

2) Achten Sie auf die korrekte Konfiguration von JBoss AS 7.1 

JBoss AS 7.1 ist im Lieferumfang von Hibernate 4.0.x enthalten, um diese zu aktualisieren, probieren Sie diese Schritte wie in offizielles Dokument beschrieben aus.

  • aktualisieren Sie den aktuellen as7/modules/org/hibernate/main-Ordner, um die neuere Version zu enthalten

  • Löschen Sie * .index-Dateien in den Ordnern as7/modules/org/hibernate/main und as7/modules/org/hibernate/envers/main

  • Sichern Sie den aktuellen Inhalt von as7/modules/org/hibernate, falls Sie einen Fehler machen

  • Entfernen Sie die älteren Gläser und kopieren Sie neue Hibernate-Gläser in as7/modules/org/hibernate/main + as7/modules/org/hibernate/envers/main.

  • Aktualisieren Sie den as7/modules/org/hibernate/main/module.xml + as7/modules/org/hibernate/envers/main/module.xml, um die Gläser zu benennen, in die Sie kopiert haben

Aktualisiert as7/modules/org/hibernate/main/module.xml wird aussehen (Beachten Sie, dass sich die Abhängigkeiten nicht ändern):

<?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

Entfernen Sie nur das javax.persistence.api-Modul zusammen mit org.hibernate

Wenn Sie für alle Webanwendungen (die abwärtskompatibel sein sollten) auf Hibernate 4.3 umstellen möchten, wechseln Sie zu einer neueren Version von Hibernate wie in der Beschreibung hier beschrieben.

Einige Tipps zum Debuggen: Überprüfen Sie nach dem Generieren Ihrer JAR-Dateien explizit, welche JPA/Hibernate-Bibliotheken sie enthalten (indem Sie sie entpacken). Um die Hibernate-Version zu überprüfen, können Sie dies auch wie hier beschrieben tun.

Überprüfen Sie auch die Struktur der jboss-deploy-structure-Datei , da das <exclusions>-Element anscheinend weder in einem <deployment> noch in einem <sub-deployment>-Element enthalten ist.

3
Andrei I

für uns funktioniert das Folgende nur für nicht containergesteuerte JPA-Szenarien! ):

  1. IDE-Seite: (Eclipse Kepler) Entfernen (während der Tests hinzugefügt und vergessen zu entfernen) der (lokal installiert) JBoss 7.1.1.Final Library project Build Path dependency

  2. Maven-Seite: (mvn 3.0.4 und 3.3.3) kommentiert die folgenden Überwintern JPA 2.0 einschließlich Abschnitt in unserem globalen /pom.xml (es ist ein Ohrprojekt mit /pom.xml, ear/pom.xml, ejb/pom.xml und 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-Seite: Hinzufügen nur Hibernate-Entity-Manager 4.3.8.Final und unseren db-Treiber (postgres) als DB/ORM-bezogene Abhängigkeiten (die auch alle anderen benötigten Bibliotheken laden) in unserem /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. serverseitig: JPA 2.0 in unserem JBoss 7.1.1.Final global deaktivieren (für alle webapps/libs, wenn Sie mehrere haben) Einstellung <module name="javax.persistence.api" export="false"/>

hinweise:

0