NoSuchMethodError em javax.persistence.Table.indexes () [Ljavax / persistence / Index

85

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]
musubi
fonte
1
Você está chamando um método que não existe na versão mais recente
Brian Roach

Respostas:

79

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.

hcura
fonte
1
Incrível, funcionou! Obrigado. Para referência futura, aqui está um link para a documentação para exclusão de dependências transitivas: scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi
4
obrigado! para usuários maven: significa simplesmente não usar <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> mais
oak
4
Para a versão do hibernate-jpa-2.0-apiHibernate, também 4.2.8.Finalfunciona 4.3.0.Finalum erro.
Harmeet Singh Taara
No Play 2.2.3 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 NoSuchMethodException NoSuchMethodError:javax.persistence.JoinTable.indexes()Alguém sabe como resolver?
FrancescoM,
Também estou enfrentando o mesmo problema com a versão do Play 2.3.4. Aqui está o rastreamento de pilha play.api.UnexpectedException: Exceção inesperada [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] em play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ apply $ 1 $$ anonfun $ 1.apply (ApplicationProvider.scala: 170) ~ [play_2.11-2.3.4.jar: 2.3.4] em play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ apply $ 1 $$ anonfun $ 1.apply (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] em scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar
71

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

JB Nizet
fonte
Eu estava descendo a mesma trilha, mas o código onde o erro acontece está chamando indexes()uma referência do tipo org.hibernate.annotations.Table.
Sotirios Delimanolis
1
Você provavelmente não está olhando para o código certo, então. Consulte github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet
1
@JBNizet O JPA 2.1 está disponível apenas no Java EE 7 e não no SE 7? E estou supondo que o JPA 2.0 está disponível no Java SE 7?
musubi
2
@JBNizet então qual é a solução. Posso mudar para java EE para 7 ou posso mudar JPA 2.0 para JPA 2.1 ?? Se eu fizer isso dá erro ..
Shailendra Madda
1
<! - mvnrepository.com/artifact/javax.persistence/… -> <dependency> <groupId> javax.persistence </groupId> <artifactId> javax.persistence-api </artifactId> <version> 2.2 </ version > </dependency>
bula
15

Provavelmente, você tem 2 versões diferentes de hibernate-jpa-api no caminho de classe. Para verificar essa execução:

mvn dependency:tree >dep.txt

Em seguida, pesquise se há hibernate-jpa-2.0-api e hibernate-jpa-2.1-api. E exclua o excesso.

Xelian
fonte
14

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>
Herbert Rausch
fonte
6

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.

Sinihong
fonte
4

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.

Marceloni Lima
fonte
0

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

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
Damitha Dayananda
fonte
0

Eu tive o mesmo problema, corrigi-lo usando org.hibernate.annotations.Tableanotação em vez de javax.persistence.Tablena classe Entity.

import javax.persistence.Entity;
import org.hibernate.annotations.Table;

@Entity
@Table(appliesTo = "my_table")
public class MyTable{
//and rest of the code
Praveen
fonte
0

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.

  1. Removendo o jar incorreto no caminho da biblioteca do Application Servers. Prossiga com cuidado, pois isso pode interromper outros aplicativos hospedados.

Em Tomee 1.7.5 Plume / Web, ele será empacotado eclipselink-2.4.2na libpasta usando JPA 2.0, mas eu tive que usar JPA 2.1 de org.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.

  1. Adicione uma biblioteca compartilhada. e adicionar manualmente jars ao caminho do servidor de aplicativos. O Websphere tem essa opção.

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

abitcode
fonte