我有一个Play Framework应用程序,我 使用Hibernate 4.2.5.Final(通过Maven依赖管理器检索)。我决定升级到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]
答案 0 :(得分:79)
我遇到了同样的问题。这里的问题是play-java-jpa工件(build.sbt文件中的javaJpa键)取决于规范(version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final")
的不同版本。
当您添加hibernate-entitymanager 4.3时,这为实体管理器带来了更新的规范(2.1)和不同的工厂提供程序。基本上你最终将类路径中的两个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 :(得分:70)
Hibernate 4.3是第一个实现JPA 2.1规范的版本(Java EE 7的一部分)。因此,它期望类路径中的JPA 2.1库,而不是JPA 2.0库。这就是你得到这个例外的原因:Table.indexes()是Table的一个新属性,在JPA 2.1中引入
答案 2 :(得分:13)
你可能在类路径上有两个不同版本的hibernate-jpa-api。检查运行:
mvn dependency:tree >dep.txt
然后搜索是否有hibernate-jpa-2.0-api和hibernate-jpa-2.1-api。并排除多余的一个。
答案 3 :(得分:13)
我将我的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>
答案 4 :(得分:6)
我可以简单地用'hibernate-jpa-2.1-api'替换位于jboss7 / modules / javax / persistence / api / main的JPA api jar文件来解决这个问题。还可以在目录中更新module.xml。
答案 5 :(得分:3)
错误: 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>
希望它有所帮助。
答案 6 :(得分:0)
我在Spring Boot应用程序中遇到了相同的问题。从lib文件夹中手动删除javax.persistance.jar文件后。问题是固定的。在pom.xml文件中,我仅遵循依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
答案 7 :(得分: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
答案 8 :(得分:0)
您的类路径中有多个JPA提供程序。或至少位于您的Application Server lib文件夹中。
如果您正在使用Maven 使用此处https://stackoverflow.com/a/47474708/3333878
中提到的命令检查依赖性然后通过删除/排除不需要的依赖项进行修复。
如果您的类路径中只有一个依赖项,则可能是应用程序服务器的类加载器。
由于JavaEE应用程序服务器(如Websphere,Wildfly,Tomee等)具有自己的JPA和其他EE标准的实现,因此Class loader可能会加载其自己的实现,而不是从WAR / EAR文件中的类路径中选择。
为避免这种情况,您可以尝试以下步骤。
在Tomee 1.7.5 Plume / Web中,它将使用JPA 2.0将eclipselink-2.4.2
捆绑在lib
文件夹中,但是我不得不使用org.hibernate:hibernate-core:5.1.17
中的JPA 2.1,因此删除了eclipselink jar并添加了来自休眠核心的所有相关/传递依赖项。
添加共享库。并手动将jar添加到应用服务器的路径。 Websphere具有此选项。
在Websphere中,可以更改类加载器的执行。因此将其加载为应用服务器的类路径,使其最后加载(即,最后一次加载父级)并首先加载您的路径。可以解决这个。
在继续第一点之前,请检查您的应用服务器是否具有上述功能。
IBM Websphere参考: