Hibernate 4.3.0.Final 和 Spring Data JPA 1.4.3.RELEASE

8

我第一次尝试设置和使用Spring Data。自然而然,您会想要使用最新版本(Spring Data JPA 1.4.3.RELEASE和Hibernate 4.3.0.Final)。按照在线示例进行配置后,应用程序抛出了异常。

 <dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-jpa</artifactId>
   <version>1.4.3.RELEASE</version>
 </dependency>
 <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>Hibernate 4.3.0.Final</version>
   <exclusions>
     <exclusion>
       <artifactId>commons-collections</artifactId>
       <groupId>commons-collections</groupId>
     </exclusion>
   </exclusions>
 </dependency>
 <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-search</artifactId>
   <version>4.4.2.Final</version>
   <exclusions>
     <exclusion>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-core</artifactId>
     </exclusion>
   </exclusions>
 </dependency>

这是错误/异常信息:
 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [test-service-persistance-application-context.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:121)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
... 31 more

 Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:936)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3762)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3716)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:150)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:67)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:318)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
... 46 more

我只能找到一个解决方法,那就是将Hibernate版本回退至4.2.8.Final。我无法让该配置正常工作。

7个回答

19

您的classpath似乎同时包含JPA 2.0和JPA 2.1 JAR,前者被首先发现,因此导致Hiberate失败。从您列出的依赖声明中,不清楚为什么会这样,因为Spring Data JPA 1.4.3肯定不会拉取它。

所以我建议尝试mvn dependency:tree,查找JPA 2.0 JAR和实际上谁在传递依赖它(也许您甚至已经在本地声明了它)。如果您仍然陷入困境,请随时将Maven命令的输出添加到您的问题中。


1
如果应用程序服务器是 Jboss 7.1,那么它可能会拉取 JPA 2.0。 - andreadi
我从我的项目中排除了jpa 2.0,然后就解决了问题。+1 - Ismail Yavuz
嗨 @ismailyavuz,你能告诉我们如何从项目中排除 jpa 2.0 的细节吗? - danisupr4
1
嗨 @danisupr4,这是我的 pom.xml 相关部分: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.2.2.Final</version> <exclusions> <exclusion> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </exclusion> </exclusions> </dependency> - Ismail Yavuz

2

如果您使用Jboss Web服务器,您可能希望在pom.xml中排除hibernate-jpa-2.0-api,例如:

<dependency>
   <groupId>org.jboss.spec</groupId>
   <artifactId>jboss-javaee-6.0</artifactId>
   <version>1.0.0.Final</version>
   <type>pom</type>
   <scope>provided</scope>
   <exclusions>
      <exclusion>
         <groupId>org.hibernate.javax.persistence</groupId>
         <artifactId>hibernate-jpa-2.0-api</artifactId>
      </exclusion>
   </exclusions>
</dependency>

添加hibernate-jpa-2.1-api依赖到你的pom.xml文件中,例如:

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

最后注:仔细阅读堆栈跟踪,你的查询并不是引起错误的原因,而是在创建EntityManagerFactory时引起的,因为你的一些实体在@Table注释中使用了该属性。要么删除该属性的使用,要么将库移动到JPA 2.1。

此外,您需要从JBoss中排除jpa子系统,并可以按照以下方式执行:

  1. Create /WEB-INF/jboss-deployment-structure.xml
  2. Exclude the jpa subsystem: here is a full example

    <?xml version="1.0"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
       <deployment>
           <exclude-subsystems>
              <subsystem name="jpa" />
           </exclude-subsystems>
           <exclusions>
              <module name="javaee.api" />
           </exclusions>
      </deployment></jboss-deployment-structure>
    
-享受吧!

1
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>${spring-data.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.0-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

在spring-data-jpa 1.4.3.RELEASE的依赖中排除hibernate-jpa-2.0-api。 - Slim BH

0
我们遇到了同样的问题。我们有一个使用Spring和Hibernate 4.3.10.FINAL与JBoss 7.1.3的Web应用程序。Hibernate带有JPA 2.1,而JBoss带有JPA 2.0。在部署应用程序时,两者发生了冲突。
你有很多解决方案。正如其他人所说,你可以将你想要的hibernate-jpa jar版本放在jboss的模块目录下(jboss/modules/javax/persistence/api/main),并更新modules.xml文件以使用正确的版本。
另一种解决方案(我们选择的)是防止JBoss在部署时隐式加载Jboss JPA。在这种情况下,你必须在WEB-INF文件夹中创建一个名为jboss-deployment-structure.xml的文件,并添加以下排除项:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>    
<exclude-subsystems>
<subsystem name="jpa" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
</exclusions>
</deployment>
</jboss-deployment-structure>

0

我使用了

compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final'

来解决这个问题。


0
如果你使用Eclipse,你可以在Eclipse中打开pom.xml文件,导航到依赖层次结构选项卡,以验证哪个jar被选为传递性依赖项,哪个是配置的依赖项。你需要选择传递性依赖项并删除当前指定的依赖项/或者/你需要排除传递性依赖项。

enter image description here


0
在使用JBoss EAP 6.4、JPA 2.1、Spring Boot 1.4.1、Spring Data 1.10.3和Hibernate 5.0.11时,我遇到了同样的问题。以下是解决方案:

/WEB-INF/jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclude-subsystems>
            <subsystem name="jpa" />
        </exclude-subsystems>
        <exclusions>
            <module name="javaee.api" />
            <module name="org.jboss.logging"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

赞 Ahmad 的回答,只是添加了 org.jboss.logging 的排除


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接