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

나는 플레이 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]



답변

나는 같은 문제에 부딪쳤다. 여기서 질문은 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. 이전 버전에서는 빌드 파일에 약간의 차이가있었습니다.


답변

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


답변

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

mvn dependency:tree >dep.txt

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


답변

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>


답변

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


답변

오류 : 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>

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


답변

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

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