Eu tenho um aplicativo Play Framework e estava usando o Hibernate 4.2.5.Final (que é recuperado por meio do gerenciador de dependência Maven). Decidi atualizar para o Hibernate 4.3.0.Final, recompilar meu aplicativo com sucesso e executá-lo.
Obtive a exceção abaixo e não consegui descobrir o porquê. Fiz o downgrade para 4.2.5 e esse problema não ocorreu. Então, tentei atualizar o Hibernate com cada versão final após 4.2.5. Ou seja, passei de 4.2.5.Final para 4.2.6.Final, para 4.2.7.Final, para 4.2.8.Final e depois para 4.3.Final. O problema não ocorre até que eu atualize para 4.3.0.Final.
Informação da versão Java
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
E exceção :
play.api.UnexpectedException: Unexpected exception[NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:152) ~[play_2.10.jar:2.2.1]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.1]
at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.1]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110) ~[play_2.10.jar:2.2.1]
at scala.util.Success.flatMap(Try.scala:200) ~[scala-library.jar:na]
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.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3762) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3716) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
java
playframework-2.0
hibernate-4.x
musubi
fonte
fonte
Respostas:
Eu tive o mesmo problema. A questão aqui é que o artefato play-java-jpa (chave javaJpa no arquivo build.sbt) depende de uma versão diferente da especificação
(version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final")
.Quando você adicionou o hibernate-entitymanager 4.3, isso trouxe a especificação mais recente (2.1) e um provedor de fábrica diferente para o entitymanager. Basicamente, você acabou tendo ambos os jars no caminho de classe como dependências transitivas.
Edite seu arquivo build.sbt assim e isso irá corrigir temporariamente seu problema até que o play libere uma nova versão do plugin jpa para a dependência de API mais recente.
libraryDependencies ++= Seq( javaJdbc, javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), "org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final" )
Isso é para
play 2.2.x
. Nas versões anteriores, havia algumas diferenças nos arquivos de construção.fonte
<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId>
maishibernate-jpa-2.0-api
Hibernate, também4.2.8.Final
funciona4.3.0.Final
um erro.libraryDependencies ++= Seq( javaJdbc, javaEbean, cache, javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), "org.hibernate" % "hibernate-core" % "4.3.0.Final", "org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final", "com.typesafe" %% "play-plugins-mailer" % "2.2.0", "postgresql" % "postgresql" % "9.1-901-1.jdbc4", "com.google.guava" % "guava-base" % "r03", "org.apache.commons" % "commons-io" % "1.3.2" )
ainda está jogando NoSuchMethodExceptionNoSuchMethodError:javax.persistence.JoinTable.indexes()
Alguém sabe como resolver?O Hibernate 4.3 é a primeira versão a implementar a especificação JPA 2.1 (parte do Java EE 7). E, portanto, está esperando a biblioteca JPA 2.1 no caminho de classe, não a biblioteca JPA 2.0. É por isso que você recebe esta exceção: Table.indexes () é um novo atributo de Tabela, introduzido em JPA 2.1
fonte
indexes()
uma referência do tipoorg.hibernate.annotations.Table
.Provavelmente, você tem 2 versões diferentes de hibernate-jpa-api no caminho de classe. Para verificar essa execução:
Em seguida, pesquise se há hibernate-jpa-2.0-api e hibernate-jpa-2.1-api. E exclua o excesso.
fonte
Eu atualizo meu Hibernate JPA para 2.1 e funciona.
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>
fonte
Eu poderia resolver o problema simplesmente substituindo o arquivo JPA api JPA que está localizado jboss7 / modules / javax / persistence / api / main por 'hibernate-jpa-2.1-api'. também com a atualização de module.xml no diretório.
fonte
Erro: java.lang.NoSuchMethodError: javax.persistence.JoinTable.indexes () [Ljavax / persistence / Index;
A única coisa que resolveu meu problema foi remover a seguinte dependência em pom.xml:
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>
E substitua por:
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency>
Espero que ajude alguém.
fonte
Eu experimentei o mesmo problema em meu aplicativo de inicialização de primavera. após remover manualmente o arquivo javax.persistance.jar da pasta lib. problema foi corrigido. no arquivo pom.xml eu permaneci seguindo apenas a dependência
fonte
Eu tive o mesmo problema, corrigi-lo usando
org.hibernate.annotations.Table
anotação em vez dejavax.persistence.Table
na classe Entity.import javax.persistence.Entity; import org.hibernate.annotations.Table; @Entity @Table(appliesTo = "my_table") public class MyTable{ //and rest of the code
fonte
Existem vários provedores JPA em seu classpath. Ou pelo menos na pasta lib do servidor de aplicativos.
Se você estiver usando o Maven, verifique as dependências usando o comando mencionado aqui https://stackoverflow.com/a/47474708/3333878
Em seguida, corrija removendo / excluindo a dependência indesejada.
Se você tiver apenas uma dependência em seu caminho de classe, o carregador de classes do servidor de aplicativos pode ser o problema.
Como os servidores de aplicativos JavaEE, como Websphere, Wildfly, Tomee etc., têm suas próprias implementações de JPA e outros padrões EE, o carregador de classes pode carregar sua própria implementação em vez de selecionar do seu classpath no arquivo WAR / EAR.
Para evitar isso, você pode tentar as etapas abaixo.
Em Tomee 1.7.5 Plume / Web, ele será empacotado
eclipselink-2.4.2
nalib
pasta usando JPA 2.0, mas eu tive que usar JPA 2.1 deorg.hibernate:hibernate-core:5.1.17
, então removi o jar eclipselink e adicionei todas as dependências relacionadas / transitivas do núcleo de hibernação.Adicione uma biblioteca compartilhada. e adicionar manualmente jars ao caminho do servidor de aplicativos. O Websphere tem essa opção.
No Websphere, a execução do carregador de classes pode ser alterada. portanto, torná-lo o classpath do servidor de aplicativos a carregar por último, ou seja, o pai por último e fazer com que seu caminho seja carregado primeiro. Pode resolver isso.
Verifique se o seu appserver possui os recursos acima, antes de prosseguir com o primeiro ponto.
Referências do Ibm websphere:
https://www.ibm.com/support/knowledgecenter/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/trun_classload_server.html
https://www.ibm.com/support/pages/how-create-shared-library-and-associate-it-application-server-or-enterprise-application-websphere-application-server
fonte