【问题标题】:Hibernate 4.3.0.Final & Spring Data JPA 1.4.3.RELEASEHibernate 4.3.0.Final & Spring Data JPA 1.4.3.RELEASE
【发布时间】:2014-01-16 08:50:48
【问题描述】:

我是第一次尝试设置和使用 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

【问题讨论】:

    标签: java spring jpa spring-data spring-data-jpa


    【解决方案1】:

    您的类路径显然包含 JPA 2.0 和 JPA 2.1 JAR,前者首先被发现,因此导致 Hiberate 失败。从您列出的依赖声明中不清楚为什么,因为 Spring Data JPA 1.4.3 肯定不会将其引入。

    所以我建议尝试mvn dependency:tree 并查看 JPA 2.0 JAR 以及实际上依赖于它的人(也许您甚至已经在本地声明了它)。如果您仍然无法解决问题,请随时将 Maven 命令的输出添加到您的问题中。

    【讨论】:

    • JPA 2.0 可能会被应用服务器拉取,例如 Jboss 7.1。
    • 我已经从我的项目中排除了 jpa 2.0,而不是成功.. +1
    • 嗨@ismailyavuz,您能告诉我们如何从项目中排除 jpa 2.0 的详细信息吗?
    • 嗨@danisupr4,这是我的pom.xml的相关部分:org.hibernatehibernate-entitymanager4.2.2 .Finalhibernate-jpa-2.0-apiorg.hibernate.javax.persistence依赖>
    【解决方案2】:

    如果你使用 Jboss web server,你想从 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>
    

    并在你的 pom.xml 中添加 hibernate-jpa-2.1-api 依赖,例如:

     <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. 创建/WEB-INF/jboss-deployment-structure.xml
    2. 排除 jpa 子系统:这是一个完整的例子

      <?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>
      

    -享受吧!

    【讨论】:

      【解决方案3】:
          <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
      【解决方案4】:

      如果您确实使用 eclipse,您可以在 eclipse 中打开 pom.xml 并导航到依赖层次结构选项卡,以验证哪个 jar 被拾取为传递依赖项,以及哪个 jar 是您配置的。您必须选择传递依赖项并删除当前指定的依赖项/或/您必须排除传递依赖项。

      【讨论】:

        【解决方案5】:

        我用过

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

        解决它。

        【讨论】:

          【解决方案6】:

          我们遇到了同样的问题。我们有一个使用 Spring 和 Hibernate 4.3.10.FINAL 和 JBoss 7.1.3 的 Web 应用程序。 Hibernate 带有 JPA 2.1,而 JBoss 带有 JPA 2.0。两者在部署应用程序时发生冲突。 你有很多解决方案。正如其他人所说,您可以将您想要的hibernate-jpa jar版本放在jboss的modules目录中(jboss/modules/javax/persistence/api/main),并将modules.xml更新为好的版本。 另一种解决方案(我们选择的那个)是防止 JBoss JPA 在部署时被 JBoss 隐式加载。在这种情况下,您必须在您的 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>
          

          【讨论】:

            【解决方案7】:

            在遇到与 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 添加了排除项

            【讨论】:

              猜你喜欢
              • 2016-12-22
              • 2016-11-10
              • 2016-11-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-09
              • 2014-01-19
              • 1970-01-01
              相关资源
              最近更新 更多