Javax.persistence.Table.indexes () [Ljavax / persistence / Index içinde NoSuchMethodError


85

Bir Çal Çerçeve uygulama var ve ben oldu (Maven bağımlılık yöneticisi aracılığı alınır) hazırda 4.2.5.Final kullanarak. Hibernate 4.3.0.Final'e yükseltmeye karar verdim, uygulamamı başarıyla yeniden derledim ve çalıştırdım.

Aşağıdaki istisnayı buldum ve nedenini çözemedim. 4.2.5'e geri döndüm ve bu sorun oluşmadı. Daha sonra, 4.2.5'ten sonraki her Final sürümünde Hibernate'i yükseltmeyi denedim. Yani, 4.2.5. Final'den 4.2.6. Final'e, 4.2.7. Final'e, 4.2.8. Final'e ve ardından 4.3. Final'e gittim. 4.3.0.Final sürümüne yükseltene kadar sorun oluşmaz.

Java sürüm bilgisi

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)

Ve istisna :

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
Yeni sürümde bulunmayan bir yöntemi çağırıyorsunuz
Brian Roach

Yanıtlar:


79

Ben de aynı problemle karşılaştım. Buradaki soru, play-java-jpa yapıtının (build.sbt dosyasındaki javaJpa anahtarı) spesifikasyonun farklı bir sürümüne bağlı olmasıdır (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Hazırda bekletme-entitymanager 4.3'ü eklediğinizde, bu, daha yeni spesifikasyonu (2.1) ve varlık yöneticisi için farklı bir fabrika sağlayıcısını getirdi. Temel olarak, geçişli bağımlılıklar olarak sınıf yolunda her iki kavanozun da olmasıyla sonuçlandınız.

Build.sbt dosyanızı bu şekilde düzenleyin ve play, daha yeni api bağımlılığı için jpa eklentisinin yeni bir sürümünü yayınlayana kadar sorunu geçici olarak çözecektir.

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

Bu için play 2.2.x. Önceki sürümlerde, yapı dosyalarında bazı farklılıklar vardı.


1
Harika, işe yaradı! Teşekkürler. Gelecekte referans olması için, geçişli bağımlılıkları hariç tutmak için dokümantasyonun bir bağlantısı: scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi

4
Teşekkürler! maven kullanıcıları için: sadece do not kullanımı anlamına gelir <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> bir daha
meşe

4
İçin hibernate-jpa-2.0-apiHazırda 4.2.8.FinalVersion iştir 4.3.0.Finalda bir hata atmak.
Harmeet Singh Taara

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" )Oyunda 2.2.3 hala NoSuchMethodException atıyor NoSuchMethodError:javax.persistence.JoinTable.indexes()Herkes nasıl çözüleceğini biliyor mu?
FrancescoM

Play 2.3.4 sürümüyle de aynı sorunla karşılaşıyorum. Yığın izleme play.api.UnexpectedException: Beklenmeyen istisna [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] 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] play.core.ReloadableApplication $$ anonfun $ $ 1 $$ anonfun $ uygula $ 1 $$ uygula anonfun $ 1.apply (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] scala.Option.map'de (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar

71

Hibernate 4.3, JPA 2.1 spesifikasyonunu (Java EE 7'nin parçası) uygulayan ilk versiyondur. Ve bu nedenle, JPA 2.0 kitaplığını değil, sınıf yolunda JPA 2.1 kitaplığını bekliyor. İşte bu yüzden bu istisnayı alıyorsunuz: Table.indexes (), JPA 2.1'de tanıtılan yeni bir Table özelliğidir.


Ben de aynı yoldan gidiyordum ama hatanın meydana geldiği kod indexes(), bir tür referansı çağırıyor org.hibernate.annotations.Table.
Sotirios Delimanolis

1
O halde muhtemelen doğru koda bakmıyorsunuzdur. Bkz. Github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet

1
@JBNizet JPA 2.1 yalnızca Java EE 7'de mi mevcut, SE 7'de değil mi? Ve tahminimce JPA 2.0 Java SE 7'de mevcuttur?
musubi

2
@JBNizet öyleyse çözüm nedir. Java EE'yi 7 olarak değiştirebilir miyim veya JPA 2.0'ı JPA 2.1 olarak değiştirebilir miyim? Bunu yaparsam hata veriyor ..
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

Muhtemelen sınıf yolunda 2 farklı hibernate-jpa-api sürümüne sahipsiniz. Bu çalışmayı kontrol etmek için:

mvn dependency:tree >dep.txt

Sonra hazırda bekletme-jpa-2.0-api ve hazırda bekletme-jpa-2.1-api olup olmadığını araştırın. Ve fazla olanı hariç tutun.


14

Hibernate JPA'mı 2.1'e güncelliyorum ve çalışıyor.

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

6

Jboss7 / module / javax / persistence / api / main'de bulunan JPA api jar dosyasını 'hibernate-jpa-2.1-api' ile değiştirerek sorunu çözebilirim. ayrıca dizindeki module.xml dosyasını güncelleyerek.


4

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

Sorunumu çözen tek şey, pom.xml'de aşağıdaki bağımlılığı kaldırmaktı: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

Ve şununla değiştirin:

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

Umarım birine yardımcı olur.


0

Spring boot uygulamamda da aynı sorunu yaşadım. javax.persistance.jar dosyasını lib klasöründen elle kaldırdıktan sonra. sorun düzeltildi. pom.xml dosyasında yalnızca bağımlılığı izledim

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

0

Ben de aynı sorunu yaşadım , Entity sınıfı org.hibernate.annotations.Tableyerine açıklama kullanarak düzelttim 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

Sınıf yolunuzda birden çok JPA sağlayıcısı var. Veya en azından Uygulama sunucusu kitaplık klasörünüzde.

Maven kullanıyorsanız, https://stackoverflow.com/a/47474708/3333878 burada belirtilen komutu kullanarak bağımlılıkları kontrol edin

Ardından istenmeyen bağımlılığı kaldırarak / hariç tutarak düzeltin.

Sınıf yolunuzda yalnızca bir bağımlılık varsa, sorun uygulama sunucusunun sınıf yükleyicisi olabilir.

Websphere, Wildfly, Tomee vb. Gibi JavaEE uygulama sunucularının kendi JPA ve diğer EE Standartları uygulamaları olduğundan, Sınıf yükleyici, WAR / EAR dosyasındaki sınıf yolunuzdan seçim yapmak yerine kendi uygulamasını yükleyebilir.

Bunu önlemek için aşağıdaki adımları deneyebilirsiniz.

  1. Uygulama Sunucuları kitaplık yolundaki sorun teşkil eden kavanozun kaldırılması. Diğer barındırılan uygulamaları bozabileceği için Dikkatli olun.

Tomee 1.7.5 Plume / Web yılında paketlenmiş olacak eclipselink-2.4.2içinde libJPA 2.0 kullanan klasörde, fakat benim JPA 2.1 kullanmak zorunda org.hibernate:hibernate-core:5.1.17böylece EclipseLink kavanoz çıkarılıp hazırda çekirdekten ilgili tüm / geçişli bağımlılıkları eklendi.

  1. Paylaşılan bir kitaplık ekleyin. ve uygulama sunucusunun yoluna manuel olarak kavanozlar ekleyin. Websphere bu seçeneğe sahiptir.

  2. Websphere'de, sınıf yükleyicinin yürütülmesi değiştirilebilir. bu nedenle uygulama sunucusunun sınıf yolu en son, yani üst öğe en son ve yolunuzun ilk olarak yüklenmesini sağlar. Bunu çözebilir.

İlk noktaya geçmeden önce uygulama sunucunuzun yukarıdaki özelliklere sahip olup olmadığını kontrol edin.

IBM websphere Referansları:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.