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


85

Tôi có một ứng dụng Play Framework và tôi đang sử dụng Hibernate 4.2.5.Final (được truy xuất thông qua trình quản lý phụ thuộc Maven). Tôi quyết định nâng cấp lên Hibernate 4.3.0 Cuối cùng, biên dịch lại ứng dụng của tôi thành công và chạy nó.

Tôi có một ngoại lệ dưới đây và không thể tìm ra lý do. Tôi đã hạ cấp trở lại 4.2.5 và sự cố này không xảy ra. Sau đó, tôi đã thử nâng cấp Hibernate với mỗi bản phát hành Final sau 4.2.5. Đó là, tôi đã đi từ 4.2.5 Cuối cùng đến 4.2.6 Cuối cùng, đến 4.2.7 Cuối cùng, đến 4.2.8 Cuối cùng rồi đến 4,3 Cuối cùng. Sự cố không xảy ra cho đến khi tôi nâng cấp lên 4.3.0.Final.

Thông tin phiên bản 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)

Và ngoại lệ :

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
Bạn đang gọi điện thoại một phương pháp mà không tồn tại trong các phiên bản mới hơn
Brian Roach

Câu trả lời:


79

Tôi đã gặp phải vấn đề tương tự. Câu hỏi ở đây là tạo tác play-java-jpa (khóa javaJpa trong tệp build.sbt) phụ thuộc vào một phiên bản khác của thông số kỹ thuật (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Khi bạn thêm hibernate-entitymanager 4.3, điều này đã mang lại thông số kỹ thuật mới hơn (2.1) và một nhà cung cấp nhà máy khác cho entitymanager. Về cơ bản, bạn đã kết thúc việc có cả hai lọ trong đường dẫn classpath dưới dạng phụ thuộc bắc cầu.

Chỉnh sửa tệp build.sbt của bạn như thế này và nó sẽ tạm thời khắc phục sự cố cho bạn cho đến khi play phát hành phiên bản mới của plugin jpa cho phụ thuộc api mới hơn.

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

Điều này dành cho play 2.2.x. Trong các phiên bản trước, có một số khác biệt trong các tệp xây dựng.


1
Tuyệt vời, nó đã hoạt động! Cảm ơn. Để tham khảo trong tương lai, đây là một liên kết đến tài liệu để loại trừ các phụ thuộc bắc cầu
musubi

4
cảm ơn! đối với người dùng maven: điều đó có nghĩa là không sử dụng <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> nữa
oak

4
Đối với Phiên bản hibernate-jpa-2.0-apiHibernate 4.2.8.Finallà công việc 4.3.0.Finalcũng ném một lỗi.
Harmeet Singh Taara

Trên 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" )vẫn ném NoSuchMethodException Có NoSuchMethodError:javax.persistence.JoinTable.indexes()ai biết cách giải quyết không?
FrancescoM

Tôi cũng gặp phải vấn đề tương tự với phiên bản Play 2.3.4. Đây là dấu vết ngăn xếp play.api.UnepectException: Ngoại lệ không mong muốn [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / Persence / Index;] tại play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ áp dụng $ 1 $$ anonfun $ 1.apply (ApplicationProvider.scala: 170) ~ [play_2.11-2.3.4.jar: 2.3.4] tại 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] tại scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar

71

Hibernate 4.3 là phiên bản đầu tiên triển khai thông số kỹ thuật JPA 2.1 (một phần của Java EE 7). Và do đó, nó mong đợi thư viện JPA 2.1 trong classpath, không phải thư viện JPA 2.0. Đó là lý do tại sao bạn nhận được ngoại lệ này: Table.indexes () là một thuộc tính mới của Table, được giới thiệu trong JPA 2.1


Tôi đã đi xuống cùng một bài hát nhưng mã nơi xảy ra lỗi đang gọi indexes()một tham chiếu của loại org.hibernate.annotations.Table.
Sotirios Delimanolis

1
Vì vậy, có thể bạn đang không nhìn đúng mã. Xem github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet

1
@JBNizet Có phải JPA 2.1 chỉ khả dụng trong Java EE 7 và không có trong SE 7? Và tôi đoán JPA 2.0 có sẵn trong Java SE 7 không?
musubi

2
@JBNizet vậy giải pháp là gì. Tôi có thể đổi sang java EE thành 7 hay tôi có thể đổi JPA 2.0 thành JPA 2.1 được không ?? Nếu tôi làm như vậy cho lỗi ..
Shailendra Madda

1
<! - mvnrepository.com/artifact/javax.persistence/… -> <dependency> <groupId> javax.persistence </groupId> <artifactId> javax.persistence-api </artifactId> <version> 2.2 </ phiên bản > </dependency>
bula

15

Bạn có thể có 2 phiên bản khác nhau của hibernate-jpa-api trên classpath. Để kiểm tra việc chạy:

mvn dependency:tree >dep.txt

Sau đó, tìm kiếm xem có hibernate-jpa-2.0-api và hibernate-jpa-2.1-api hay không. Và loại trừ cái thừa.


14

Tôi cập nhật Hibernate JPA của mình lên 2.1 và Nó hoạt động.

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

6

Tôi có thể giải quyết vấn đề đơn giản bằng cách thay thế tệp jar JPA api được đặt jboss7 / modules / javax / Persence / api / main bằng 'hibernate-jpa-2.1-api'. cũng với việc cập nhật module.xml trong thư mục.


4

Lỗi: java.lang.NoSuchMethodError: javax.persistence.JoinTable.indexes () [Ljavax / Persence / Index;

Điều duy nhất giải quyết được vấn đề của tôi là loại bỏ sự phụ thuộc sau trong pom.xml: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

Và thay thế nó cho:

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

Hy vọng nó sẽ giúp một ai đó.


0

tôi đã gặp sự cố tương tự trong ứng dụng khởi động mùa xuân của mình. sau khi xóa thủ công tệp javax.persistance.jar khỏi thư mục lib. vấn đề đã được khắc phục. trong tệp pom.xml, tôi chỉ theo dõi phụ thuộc

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

0

Tôi đã gặp vấn đề tương tự, tôi đã sửa nó bằng cách sử dụng org.hibernate.annotations.Tablechú thích thay vì javax.persistence.Tabletrong lớp Thực thể.

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

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

0

Có nhiều nhà cung cấp JPA trong classpath của bạn. Hoặc ít nhất trong thư mục lib máy chủ ứng dụng của bạn.

Nếu bạn đang sử dụng Maven Kiểm tra sự phụ thuộc bằng lệnh được đề cập tại đây https://stackoverflow.com/a/47474708/3333878

Sau đó khắc phục bằng cách loại bỏ / loại trừ phần phụ thuộc không mong muốn.

Nếu bạn chỉ có một tệp tin phụ thuộc trong classpath của mình, thì trình tải lớp của máy chủ ứng dụng có thể là vấn đề.

Vì các máy chủ ứng dụng JavaEE như Websphere, Wildfly, Tomee, v.v., có các triển khai JPA và các Tiêu chuẩn EE khác của chúng, nên Bộ nạp Lớp có thể tải triển khai của chính nó thay vì chọn từ classpath của bạn trong tệp WAR / EAR.

Để tránh điều này, bạn có thể thử các bước dưới đây.

  1. Xóa bình vi phạm trong đường dẫn thư viện Máy chủ ứng dụng. Tiếp tục với Thận trọng, vì nó có thể phá vỡ các ứng dụng được lưu trữ khác.

Trong Tomee 1.7.5 Plume / Web, nó sẽ được đóng gói eclipselink-2.4.2trong libthư mục sử dụng JPA 2.0, nhưng tôi đã phải sử dụng JPA 2.1 từ đó org.hibernate:hibernate-core:5.1.17, vì vậy hãy loại bỏ jar eclipselink và thêm tất cả các phụ thuộc liên quan / bắc cầu từ lõi ngủ đông.

  1. Thêm một thư viện được chia sẻ. và thêm các lọ vào đường dẫn của máy chủ ứng dụng theo cách thủ công. Websphere có tùy chọn này.

  2. Trong Websphere, việc thực thi trình nạp lớp có thể được thay đổi. vì vậy làm cho nó trở thành classpath của máy chủ ứng dụng để tải cuối cùng, tức là cấp cuối cùng và tải đường dẫn của bạn trước. Có thể giải quyết điều này.

Kiểm tra xem máy chủ ứng dụng của bạn có các tính năng trên hay không, trước khi tiếp tục với điểm đầu tiên.

Tài liệu tham khảo trên websphere 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.