2014-01-16 5 views
8

Ich habe versucht, Spring Data zum ersten Mal einzurichten und zu verwenden. Natürlich möchten Sie die neueste Version (Spring Data JPA 1.4.3.RELEASE & Hibernate 4.3.0.Final) verwenden. Nach der Konfiguration gemäß den Beispielen online, hat die Anwendung eine Ausnahme ausgelöst.Hibernate 4.3.0.Final- und Federdaten JPA 1.4.3.RELEASE

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-jpa</artifactId> 
    <version>1.4.3.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>Hibernate 4.3.0.Final</version> 
    <exclusions> 
    <exclusion> 
     <artifactId>commons-collections</artifactId> 
     <groupId>commons-collections</groupId> 
    </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-search</artifactId> 
    <version>4.4.2.Final</version> 
    <exclusions> 
    <exclusion> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 

Dies war der Fehler/Ausnahme:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [test-service-persistance-application-context.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index; 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:121) 
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250) 
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64) 
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91) 
... 31 more 

Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index; 
at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:936) 
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) 
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3762) 
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3716) 
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) 
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) 
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:150) 
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:67) 
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:318) 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) 
... 46 more 

Ich konnte einfach nicht verwalten diese Konfiguration zu arbeiten. Die einzige Problemumgehung, die ich gefunden habe, war Hibernate auf Version 4.2.8.Final

Antwort

19

Ihr Classpath enthält offensichtlich sowohl die JPA 2.0 und die JPA 2.1 JAR mit ersterer zuerst gefunden und damit verursacht Hiberate fehlgeschlagen. Aus den aufgelisteten Abhängigkeitsdeklarationen ist nicht klar, warum, da Spring Data JPA 1.4.3 sie definitiv nicht aufruft.

Also ich würde empfehlen, mvn dependency:tree auszuprobieren und nach der JPA 2.0 JAR zu suchen und wer eigentlich hängt davon ab (vielleicht hast du es sogar lokal deklariert). Falls Sie immer noch dabei sind, können Sie die Ausgabe des Befehls Maven zu Ihrer Frage hinzufügen.

+1

JPA 2.0 kann vom Anwendungsserver abgerufen werden, wenn es sich beispielsweise um einen Jboss 7.1 handelt. – andreadi

+0

Ich habe jpa 2.0 von meinem Projekt ausgeschlossen, als es den Trick gemacht hat. +1 –

+0

Hallo @ismailyavuz, können Sie uns die Details geben, wie man jpa 2.0 von Projekten ausschließt? – danisupr4

0

Wenn Sie Eclipse verwenden, können Sie die Datei pom.xml in Eclipse öffnen und zur Registerkarte Abhängigkeitshierarchie navigieren, um zu überprüfen, welches jar als transitive Abhängigkeit ausgewählt wurde und welches von Ihnen konfiguriert wurde. Sie müssten diejenige auswählen, die die transitive Abhängigkeit ist, und die aktuell angegebene Abhängigkeit entfernen/OR/Sie müssten die transitive Abhängigkeit ausschließen.

enter image description here

1
<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> 
+0

exclude Hibernate-jpa-2.0-API im Frühjahr-Daten-jpa 1.4.3. RELEASE Abhängigkeit –

0

I verwendet

Kompilierung 'org.hibernate.javax.persistence: Hibernate-JPA-2.1-api: 1.0.0.Final'

es sovle.

2

Wenn Sie Jboss Web-Server verwenden, möchten Sie die Hibernate-JPA-2.0-api von pom.xml auszuschließen, zum Beispiel:

<dependency> 
    <groupId>org.jboss.spec</groupId> 
    <artifactId>jboss-javaee-6.0</artifactId> 
    <version>1.0.0.Final</version> 
    <type>pom</type> 
    <scope>provided</scope> 
    <exclusions> 
     <exclusion> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.0-api</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Und hibernate-jpa-2.1-api Abhängigkeit zu Ihrem pom.xml hinzufügen, für Beispiel:

<dependency> 
    <groupId>org.hibernate.javax.persistence</groupId> 
    <artifactId>hibernate-jpa-2.1-api</artifactId> 
    <version>1.0.0.Final</version> 
</dependency> 

Abschließender Hinweis: Lesen sie die Stacktrace, Ihre Abfrage den Fehler nicht verursacht wird, verursacht wird, wenn die EntityManagerFactory erstellt wird, weil einige Ihrer Einheiten sind diese Eigenschaft in einer @Table Annotation verwenden. Löschen Sie entweder die Verwendung der Eigenschaft oder verschieben Sie Ihre Bibliotheken nach JPA 2.1.

Außerdem müssen Sie das JPA-Subsystem von JBoss auszuschließen, und Sie würden wie folgt tun:

  1. /WEB-INF/jboss-deployment-structure.xml erstellen
  2. ausschließen das JPA-Subsystem: hier ist ein vollständiges Beispiel

    <?xml version="1.0"?> 
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
        <deployment> 
         <exclude-subsystems> 
          <subsystem name="jpa" /> 
         </exclude-subsystems> 
         <exclusions> 
          <module name="javaee.api" /> 
         </exclusions> 
        </deployment></jboss-deployment-structure> 
    

-Genießen!

0

Wir hatten das gleiche Problem. Wir haben eine Web-App mit Spring und Hibernate 4.3.10.FINAL mit JBoss 7.1.3. Der Hibernate kommt mit JPA 2.1 und der JBoss mit JPA 2.0. Die beiden waren beim Bereitstellen der App in Konflikt. Sie haben viele Lösungen. Wie von anderen gesagt, können Sie die gewünschte Version von hibernate-jpa jar in das jboss-Modul modules (jboss/modules/javax/persistence/api/main) stellen und die modules.xml mit der guten Version aktualisieren. Eine andere Lösung (die wir gewählt haben) besteht darin, zu verhindern, dass JBoss JPA bei der Bereitstellung implizit von JBoss geladen wird. In diesem Fall haben Sie jboss-Deployment-structure.xml im WEB-INF folder.And fügen Sie die Ausschlüsse wie unten eine Datei mit dem Namen zu erstellen:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
<deployment>  
<exclude-subsystems> 
<subsystem name="jpa" /> 
</exclude-subsystems> 
<exclusions> 
<module name="javaee.api" /> 
</exclusions> 
</deployment> 
</jboss-deployment-structure> 
0

Nach dem Ausführen in gleiche Probleme mit JBoss EAP 6.4, JPA 2.1, Frühling Boot-1.4.1, Spring Data 1.10.3, Hibernate 5.0.11, das ist die Lösung, die für mich gearbeitet:

/WEB-INF/jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
    <deployment> 
     <exclude-subsystems> 
      <subsystem name="jpa" /> 
     </exclude-subsystems> 
     <exclusions> 
      <module name="javaee.api" /> 
      <module name="org.jboss.logging"/> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

Kudos zu Ahmads Antwort, nur hinzugefügt Ausschluss für org.jboss.logging

Verwandte Themen