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


85

나는 플레이 Framework 응용 프로그램을하고 난 되었다 (메이븐 의존성 관리를 통해 검색되는) 최대 절전 모드 4.2.5.Final를 사용. Hibernate 4.3.0.Final로 업그레이드하고 내 응용 프로그램을 성공적으로 다시 컴파일하고 실행하기로 결정했습니다.

아래 예외가 있는데 그 이유를 알 수 없습니다. 4.2.5로 다시 다운 그레이드했는데이 문제가 발생하지 않았습니다. 그런 다음 4.2.5 이후의 Final 릴리스마다 Hibernate를 업그레이드하려고 시도했습니다. 즉, 4.2.5.Final에서 4.2.6.Final, 4.2.7.Final, 4.2.8.Final, 4.3.Final로 이동했습니다. 4.3.0.Final로 업그레이드 할 때까지 문제가 발생하지 않습니다.

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)

그리고 예외 :

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]

1
당신은 최신 버전에 존재하지 않는 방법 전화하는거야
브라이언 로치

답변:


79

나는 같은 문제에 부딪쳤다. 여기서 질문은 play-java-jpa 아티팩트 (build.sbt 파일의 javaJpa 키)가 다른 버전의 spec에 의존한다는 것 (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final")입니다.

hibernate-entitymanager 4.3을 추가했을 때 이것은 새로운 사양 (2.1)과 entitymanager에 대한 다른 팩토리 공급자를 가져 왔습니다. 기본적으로 클래스 경로에 전이 종속성으로 두 jar가 모두 포함되었습니다.

build.sbt 파일을 이와 같이 편집하면 play가 최신 API 종속성에 대한 새 버전의 jpa 플러그인을 릴리스 할 때까지 일시적으로 문제를 해결합니다.

libraryDependencies ++= Seq(
javaJdbc,
javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"),
"org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final"
)

이것은입니다 play 2.2.x. 이전 버전에서는 빌드 파일에 약간의 차이가있었습니다.


1
훌륭합니다! 감사. 향후 참조를 위해 다음은 전 이적 종속성을 제외하기위한 문서 링크입니다 : scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi

4
감사! 받는다는 사용자 : 그냥 해달라고 사용을 의미 <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> 더 이상
오크

4
들어 hibernate-jpa-2.0-api최대 절전 모드 4.2.8.Final버전 작업은 4.3.0.Final또한 오류가 발생.
하 미트 싱 Taara

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" )에서 여전히 NoSuchMethodException을 던지고 있습니다. NoSuchMethodError:javax.persistence.JoinTable.indexes()누구든지 해결 방법을 알고 있습니까?
FrancescoM

Play 2.3.4 버전에서도 동일한 문제에 직면하고 있습니다. 다음은 스택 추적입니다. 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 : 170) ~ [play_2.11-2.3.4.jar : 2.3.4] at 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] at scala.Option.map (Option.scala : 145) ~ [scala-library-2.11.1. 항아리 :] NA
케탄 Khairnar

71

Hibernate 4.3은 JPA 2.1 사양 (Java EE 7의 일부)을 구현 한 첫 번째 버전입니다. 따라서 JPA 2.0 라이브러리가 아닌 클래스 경로에 JPA 2.1 라이브러리가 필요합니다. 이것이 바로이 예외가 발생하는 이유입니다. Table.indexes ()는 JPA 2.1에 도입 된 Table의 새로운 속성입니다.


나는 같은 길을 가고 있었지만 오류가 발생한 코드 indexes()는 유형의 참조를 호출 하고 org.hibernate.annotations.Table있습니다.
Sotirios Delimanolis

1
그렇다면 아마도 올바른 코드를보고 있지 않을 것입니다. 참조 github.com/hibernate/hibernate-orm/blob/4.3.0.Final/...
JB Nizet

1
@JBNizet JPA 2.1은 Java EE 7에서만 사용할 수 있고 SE 7에서는 사용할 수 없습니까? Java SE 7에서 JPA 2.0을 사용할 수 있다고 생각합니다.
musubi dec.

2
@JBNizet 그래서 솔루션은 무엇입니까. Java EE를 7로 변경하거나 JPA 2.0을 JPA 2.1로 변경할 수 있습니까? 그렇게하면 오류가 발생합니다.
Shailendra Madda 2014-06-25

1
<!- mvnrepository.com/artifact/javax.persistence/…- > <dependency> <groupId> javax.persistence </ groupId> <artifactId> javax.persistence-api </ artifactId> <버전> 2.2 </ version > </ dependency>
bula

15

클래스 경로에 두 가지 버전의 hibernate-jpa-api가 있습니다. 실행을 확인하려면 :

mvn dependency:tree >dep.txt

그런 다음 hibernate-jpa-2.0-api 및 hibernate-jpa-2.1-api가 있는지 검색하십시오. 그리고 초과하는 것을 제외하십시오.


14

Hibernate JPA를 2.1로 업데이트하고 작동합니다.

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

6

jboss7 / modules / javax / persistence / api / main에있는 JPA api jar 파일을 'hibernate-jpa-2.1-api'로 바꾸는 것만으로 문제를 해결할 수 있습니다. 또한 디렉토리에서 module.xml을 업데이트합니다.


4

오류 : java.lang.NoSuchMethodError : javax.persistence.JoinTable.indexes () [Ljavax / persistence / Index;

내 문제를 해결 한 유일한 방법은 pom.xml에서 다음 종속성을 제거하는 것입니다. <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

다음으로 교체하십시오.

<dependency>
  <groupId>javax.persistence</groupId>
  <artifactId>persistence-api</artifactId>
  <version>1.0.2</version>
</dependency>

누군가에게 도움이되기를 바랍니다.


0

내 봄 부팅 응용 프로그램에서 동일한 문제가 발생했습니다. lib 폴더에서 javax.persistance.jar 파일을 수동으로 제거한 후. 문제가 수정되었습니다. pom.xml 파일에서 나는 종속성을 따라 유지했습니다.

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

0

나는 같은 문제가 있었고 Entity 클래스 org.hibernate.annotations.Table대신 주석 을 사용하여 수정했습니다 javax.persistence.Table.

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

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

0

클래스 경로에 여러 JPA 공급자가 있습니다. 또는 최소한 애플리케이션 서버 lib 폴더에 있습니다.

Maven을 사용하는 경우 여기에 언급 된 명령을 사용하여 종속성 확인 https://stackoverflow.com/a/47474708/3333878

그런 다음 원치 않는 종속성을 제거 / 제외하여 수정합니다.

클래스 경로에 종속성이 하나만있는 경우 애플리케이션 서버의 클래스 로더가 문제 일 수 있습니다.

Websphere, Wildfly, Tomee 등과 같은 JavaEE 응용 프로그램 서버에는 자체 JPA 및 기타 EE 표준 구현이 있으므로 클래스 로더는 WAR / EAR 파일의 클래스 경로에서 선택하는 대신 자체 구현을로드 할 수 있습니다.

이를 방지하려면 아래 단계를 시도해보세요.

  1. 애플리케이션 서버 라이브러리 경로에서 문제가되는 jar를 제거합니다. 다른 호스팅 된 응용 프로그램을 손상시킬 수 있으므로주의하여 진행하십시오.

Tomee 1.7.5 Plume / Web에서는 JPA 2.0을 사용 eclipselink-2.4.2하여 lib폴더에 번들로 제공 되지만에서 JPA 2.1을 사용해야 org.hibernate:hibernate-core:5.1.17했기 때문에 eclipselink jar를 제거하고 최대 절전 모드 코어에서 모든 관련 / 전이 종속성을 추가했습니다.

  1. 공유 라이브러리를 추가하십시오. 앱 서버의 경로에 jar를 수동으로 추가하십시오. Websphere에는이 옵션이 있습니다.

  2. Websphere에서 클래스 로더의 실행을 변경할 수 있습니다. 따라서 응용 프로그램 서버의 클래스 경로를 마지막으로로드합니다. 즉, 부모는 마지막으로로드하고 경로를 먼저로드합니다. 이것을 해결할 수 있습니다.

첫 번째 지점으로 진행하기 전에 앱 서버에 위의 기능이 있는지 확인하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.