Je mets à jour jpa, hibernate, spring et jdk pour activer les nouvelles fonctionnalités de JPA 2.1. Mais j'obtiens l'erreur suivante:
Java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
J'ai lu d'autres articles à ce sujet, mais ils ne résolvent pas l'erreur sur ma machine. Par exemple, la réponse de SJuan76 à cette publication suggère une mise à niveau vers jpa 2.1, mais j'ai défini la facette du projet jpa Eclipse sur la version 2.1 et j'ai également inclus hibernate-jpa-2.1-api
dans mon pom.xml. Vous pouvez lire toutes les versions des différentes bibliothèques dans le pom.xml complet en cliquant sur ce lien . Que dois-je changer dans le pom.xml ou dans le projet Eclipse pour résoudre cette erreur?
Remarque: je peux me débarrasser de l'erreur en changeant la version hibernate dans le pom.xml en <hibernate.version>4.2.1.Final</hibernate.version>
, mais cela va à l'encontre de l'objectif de la mise à niveau. Est-ce que le fait de changer la version de mise en veille prolongée active et désactive l'erreur nous aide à diagnostiquer le problème?
Si le problème est que plusieurs pots entrent en conflit, je pourrais utiliser le gestionnaire de types Eclipse pour désactiver l'un des pots, mais quel pot devrais-je rechercher?
Voici la trace complète de la pile:
ERROR ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.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) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:539) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:302) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:298) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:193) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.Java:973) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:750) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:482) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.Java:389) ~[spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:294) ~[spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:112) [spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.Apache.catalina.core.StandardContext.listenerStart(StandardContext.Java:4939) [catalina.jar:7.0.42]
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5434) [catalina.jar:7.0.42]
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150) [catalina.jar:7.0.42]
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1559) [catalina.jar:7.0.42]
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1549) [catalina.jar:7.0.42]
at Java.util.concurrent.FutureTask.run(FutureTask.Java:262) [na:1.7.0_45]
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145) [na:1.7.0_45]
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615) [na:1.7.0_45]
at Java.lang.Thread.run(Thread.Java:744) [na:1.7.0_45]
Caused by: Java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.Java:936) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.Java:824) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.Java:3788) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.Java:3742) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.Java:1410) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1844) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.Java:850) ~[hibernate-entitymanager-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.Java:843) ~[hibernate-entitymanager-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.Java:397) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.Java:842) ~[hibernate-entitymanager-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.Java:152) ~[hibernate-entitymanager-4.3.5.Final.jar:4.3.5.Final]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.Java:336) ~[spring-orm-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.Java:318) ~[spring-orm-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1612) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1549) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
... 21 common frames omitted
Oct 28, 2014 11:01:16 AM org.Apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.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:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:193)
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.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.Java:389)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:294)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:112)
at org.Apache.catalina.core.StandardContext.listenerStart(StandardContext.Java:4939)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5434)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1559)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1549)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:262)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:744)
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:824)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.Java:3788)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.Java:3742)
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:397)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.Java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.Java:152)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.Java:336)
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)
... 21 more
Dans mon cas, le coupable était javaee-api et glassfish libs qui ne supportaient pas JPA 2.1
Si vous utilisez Jboss 7.1.1, jboss a déjà hibernate-jpa-2.0
dans son chemin de classe, donc lors de l'exécution, il utilise celui de son chemin de classe, pas celui que vous avez déployé avec votre application, pour pointer jboss vers le hibernate-jpa-2.1
procédez comme suit:
copie hibernate-jpa-2.1-api-1.0.0.final.jar
dans le répertoire suivant: jboss-as-7.1.1.Final/modules/javax/persistence/api/main
ouvert module.xml
et modifiez la racine de la ressource comme suit: resource-root path="hibernate-jpa-2.1-api-1.0.0.final.jar"
(le pointant vers jpa 2.1)
recompilez et redéployez votre application, alors vous êtes prêt à partir.
J'ai passé beaucoup de temps là-dessus.
Pour moi, c'était le javax.persistence.jar en conflit avec les bocaux d'hibernation.
J'ai supprimé le fichier persistence.jar et il a commencé à fonctionner.
Dans le cas de JBoss7, vous devez remplacer le pot api dans jboss7/modules/javax/persistence/api avec la mise à jour du fichier module.xml par le fichier jar mis à jour.
vous pouvez importer hibernate-jpa-2.1-api-1.0.0.Final.jar. ce n'est pas ejb3-persistence.jar.
J'ai résolu le même problème dans mon projet en excluant la bibliothèque Hibernate ejb3 qui était incluse via une dépendance transitive. La dépendance de maven dependency: tree était la suivante:
[INFO] | +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] | | +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
Dans mon projet, cela était à l'origine inclus dans le pot exécutable produit par mon processus de construction, via le plugin maven Assembly. Pour exclure cela (et d'autres bibliothèques), j'ai utilisé la configuration dependencySet du plugin Assembly dans src/main/assemble/test-jar-with-dependencies.xml:
<Assembly xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0 http://maven.Apache.org/xsd/Assembly-1.1.0.xsd">
<id>test-jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<excludes>
<exclude>org.Eclipse.persistence</exclude>
<exclude>org.hibernate:hibernate-annotations:jar:3.4.0.GA</exclude>
<exclude>org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA</exclude>
<exclude>org.hibernate:ejb3-persistence</exclude>
</excludes>
<useProjectArtifact>true</useProjectArtifact>
<useProjectAttachments>true</useProjectAttachments>
<unpack>true</unpack>
<scope>test</scope>
</dependencySet>
</dependencySets>
</Assembly>
J'espère que cela pourra aider!
Vous devez d'abord déterminer quelle dépendance apporte le mauvais JPA. Pour ce faire, utilisez la dépendance maven: tree. La sortie est assez simple et vous pourrez déterminer ce qu'il faut exclure.
Pour exclure, faites quelque chose comme ceci:
<dependencies>
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion> <!-- declare the exclusion here -->
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
</exclusions>
</dependency>
Désolé, je ne peux pas vous aider davantage, mais avec les informations que vous fournissez, c'est tout ce que je peux faire.
À votre santé.