有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaHibernate4.3.0。最终和春季数据JPA 1.4.3。释放

我第一次尝试设置和使用Spring数据。当然,您会希望使用最新版本(SpringDataJPA1.4.3.RELEASE和Hibernate4.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版。决赛


共 (6) 个答案

  1. # 1 楼答案

    我们面临着同样的问题。我们有一个使用Spring和Hibernate 4.3.10的web应用程序。最终版本为JBoss 7.1.3。Hibernate附带JPA2.1,JBoss附带JPA2.0。两人在部署应用程序时发生冲突。 你有很多解决方案。正如其他人所说,您可以将所需的hibernate jpa jar版本放在jboss的modules目录(jboss/modules/javax/persistence/api/main)中,并更新模块。具有良好版本的xml。 另一个解决方案(我们选择的)是防止Jboss在部署时隐式加载Jboss JPA。在这种情况下,必须创建一个名为jboss deployment structure的文件。WEB-INF文件夹中的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>
    
  2. # 2 楼答案

        <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>
    
  3. # 3 楼答案

    如果使用Jboss web服务器,则希望从pom中排除hibernate-jpa-2.0-api。例如,xml:

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

    最后一点注意:阅读stacktrace,您的查询并没有导致错误,它是在创建EntityManagerFactory时引起的,因为您的一些实体正在@Table注释中使用此属性。请删除该属性的用法,或将您的库移至JPA 2.1

    此外,您需要将jpa子系统从JBoss中排除,并希望执行以下操作:

    1. 创建/WEB-INF/jboss部署结构。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>
      

    -享受

  4. # 4 楼答案

    您的类路径显然同时包含JPA2.0和JPA2.1 JAR,前者首先被找到,从而导致Hibrate失败。从您列出的依赖项声明中,我们不清楚为什么,因为Spring数据JPA 1.4.3肯定没有引入它

    所以我建议尝试一下mvn dependency:tree,看看JPA2.0jar,看看谁真正地依赖它(也许你甚至已经在本地声明了它)。如果您仍然无法解决这个问题,可以将Maven命令的输出添加到您的问题中

  5. # 5 楼答案

    如果使用eclipse,可以打开pom。并导航到dependency Hierarchy选项卡,以验证哪个jar被选为可传递依赖项,哪个是您配置的依赖项。您必须选择一个是可传递依赖项,并删除当前指定的依赖项/或/您必须排除可传递依赖项

    enter image description here

  6. # 6 楼答案

    我曾经

    编译“组织”。冬眠javax。持久性:hibernate-jpa-2.1-api:1.0.0。决赛'

    解决它