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


85

ฉันมีโปรแกรมเล่นกรอบและฉันถูกใช้ Hibernate 4.2.5.Final (ซึ่งถูกดึงผ่านผู้จัดการการพึ่งพา Maven) ฉันตัดสินใจที่จะอัปเกรดเป็น Hibernate 4.3.0 ขั้นสุดท้ายคอมไพล์แอปพลิเคชันของฉันใหม่สำเร็จแล้วเรียกใช้งาน

ฉันได้รับข้อยกเว้นด้านล่างและไม่สามารถหาสาเหตุได้ ฉันลดระดับกลับเป็น 4.2.5 และปัญหานี้ไม่เกิดขึ้น จากนั้นฉันลองอัปเกรด Hibernate กับแต่ละรุ่นสุดท้ายหลังจาก 4.2.5 นั่นคือฉันเปลี่ยนจาก 4.2.5 สุดท้ายเป็น 4.2.6 สุดท้ายเป็น 4.2.7 สุดท้ายเป็น 4.2.8 สุดท้ายแล้วเป็น 4.3 ปัญหาจะไม่เกิดขึ้นจนกว่าฉันจะอัปเกรดเป็น 4.3.0 ขั้นสุดท้าย

ข้อมูลเวอร์ชัน 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
คุณกำลังเรียกใช้เมธอดที่ไม่มีในเวอร์ชันใหม่
Brian Roach

คำตอบ:


79

ฉันพบปัญหาเดียวกัน คำถามที่นี่ก็คือสิ่งประดิษฐ์เล่น Java-JPA (javaJpa สำคัญในไฟล์ build.sbt) (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final")ที่ขึ้นอยู่กับรุ่นที่แตกต่างกันของข้อมูลจำเพาะ

เมื่อคุณเพิ่ม hibernate-entitymanager 4.3 สิ่งนี้ทำให้เกิดข้อมูลจำเพาะใหม่กว่า (2.1) และผู้ให้บริการโรงงานที่แตกต่างกันสำหรับผู้จัดการเอนทิตี โดยพื้นฐานแล้วคุณจะมีทั้งสองไหใน classpath เป็นการพึ่งพาสกรรมกริยา

แก้ไขไฟล์ build.sbt ของคุณเช่นนี้และจะช่วยแก้ปัญหาของคุณได้ชั่วคราวจนกว่า play จะออกปลั๊กอิน jpa เวอร์ชันใหม่สำหรับการพึ่งพา API ที่ใหม่กว่า

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
ขอบคุณ! สำหรับผู้ใช้ maven: หมายความว่าอย่าใช้<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> อีกต่อไป
โอ๊ค

4
สำหรับhibernate-jpa-2.0-apiHibernate 4.2.8.FinalVersion 4.3.0.Finalก็มีข้อผิดพลาดเช่นกัน
Harmeet Singh Taara

On 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 นี่คือ stack trace play.api.UnexpectedException: ข้อยกเว้นที่ไม่คาดคิด [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] ที่ play.core.ReloadableApplication $$ anonfun $ รับ $ 1 $$ anonfun $ ใช้ $ 1 $$ anonfun $ 1. ใช้ (ApplicationProvider.scala: 170) ~ [play_2.11-2.3.4.jar: 2.3.4] ที่ play.core.ReloadableApplication $$ anonfun $ รับ $ 1 $$ anonfun $ ใช้ $ 1 $$ anonfun $ 1. ใช้ (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] ที่ scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1 jar: na]
Ketan Khairnar

71

Hibernate 4.3 เป็นเวอร์ชันแรกที่ใช้ข้อมูลจำเพาะ JPA 2.1 (ส่วนหนึ่งของ Java EE 7) ดังนั้นจึงคาดหวังว่าไลบรารี JPA 2.1 ใน classpath ไม่ใช่ไลบรารี JPA 2.0 นั่นเป็นเหตุผลที่คุณได้รับข้อยกเว้นนี้: Table.indexes () เป็นแอตทริบิวต์ใหม่ของ Table ซึ่งเปิดตัวใน JPA 2.1


ผมจะลงไปติดตามกัน แต่รหัสข้อผิดพลาดที่เกิดขึ้นจะเรียกในการอ้างอิงจากประเภท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 ใช่หรือไม่ และฉันเดาว่า JPA 2.0 มีอยู่ใน Java SE 7 หรือไม่
musubi

2
@JBNizet แล้วทางออกคืออะไร ฉันสามารถเปลี่ยน java EE เป็น 7 ได้หรือฉันสามารถเปลี่ยน JPA 2.0 เป็น JPA 2.1 ได้หรือไม่? หากฉันทำเช่นนั้นให้เกิดข้อผิดพลาด ..
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

คุณน่าจะมี hibernate-jpa-api 2 เวอร์ชันที่แตกต่างกันบน classpath ในการตรวจสอบการทำงานนั้น:

mvn dependency:tree >dep.txt

จากนั้นค้นหาว่ามี hibernate-jpa-2.0-api และ hibernate-jpa-2.1-api หรือไม่ และไม่รวมส่วนที่เกินออกมา



6

ฉันสามารถแก้ปัญหาได้ง่ายๆโดยการแทนที่ไฟล์ JPA api jar ซึ่งอยู่ที่ jboss7 / modules / javax / persistence / api / main ด้วย '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

ฉันประสบปัญหาเดียวกันในแอปพลิเคชัน Spring Boot หลังจากลบไฟล์ javax.persistance.jar ด้วยตนเองจากโฟลเดอร์ lib ปัญหาได้รับการแก้ไขแล้ว ในไฟล์ pom.xml ฉันยังคงติดตามการพึ่งพาเท่านั้น

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

0

ฉันมีปัญหาเดียวกันฉันแก้ไขโดยใช้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 หลายรายใน classpath ของคุณ หรืออย่างน้อยที่สุดในโฟลเดอร์ lib ของเซิร์ฟเวอร์แอปพลิเคชันของคุณ

หากคุณใช้ Maven Check สำหรับการอ้างอิงโดยใช้คำสั่งที่กล่าวถึงที่นี่https://stackoverflow.com/a/47474708/3333878

จากนั้นแก้ไขโดยการลบ / ยกเว้นการพึ่งพาที่ไม่ต้องการ

หากคุณมีการอ้างอิงเพียงรายการเดียวใน classpath ของคุณตัวโหลดคลาสของแอ็พพลิเคชันเซิร์ฟเวอร์อาจเป็นปัญหา

เนื่องจากแอ็พพลิเคชันเซิร์ฟเวอร์ JavaEE เช่น Websphere, Wildfly, Tomee เป็นต้นมีการใช้งาน JPA และมาตรฐาน EE อื่น ๆ ตัวโหลดคลาสอาจโหลดการใช้งานของตัวเองแทนที่จะเลือกจาก classpath ของคุณในไฟล์ WAR / EAR

เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถลองทำตามขั้นตอนด้านล่าง

  1. การลบ jar ที่กระทำผิดในพา ธ ไลบรารี Application Servers โปรดดำเนินการด้วยความระมัดระวังเนื่องจากอาจทำให้แอปพลิเคชันที่โฮสต์อื่น ๆ เสียหายได้

ใน Tomee 1.7.5 Plume / Web มันจะรวมeclipselink-2.4.2อยู่ในlibโฟลเดอร์โดยใช้ JPA 2.0 แต่ฉันต้องใช้ JPA 2.1 จากorg.hibernate:hibernate-core:5.1.17ดังนั้นจึงลบโถ eclipselink และเพิ่มการอ้างอิงที่เกี่ยวข้อง / การถ่ายทอดจากคอร์ไฮเบอร์เนต

  1. เพิ่มไลบรารีที่ใช้ร่วมกัน และเพิ่มไหลงในเส้นทางของเซิร์ฟเวอร์แอปด้วยตนเอง Websphere มีตัวเลือกนี้

  2. ใน Websphere การเรียกใช้ class loader สามารถเปลี่ยนแปลงได้ ดังนั้นทำให้คลาสพา ธ ของแอ็พพลิเคชันเซิร์ฟเวอร์โหลดเช่นพาเรนต์ล่าสุดและโหลดพา ธ ของคุณก่อน สามารถแก้ปัญหานี้ได้

ตรวจสอบว่าเซิร์ฟเวอร์แอปของคุณมีคุณสมบัติข้างต้นหรือไม่ก่อนดำเนินการตามจุดแรก

การอ้างอิงเว็บสเฟียร์ IBM:

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.