2014-01-16 107 views
8

我试图首次设置和使用Spring Data。当然你会想使用最新版本(Spring Data JPA 1.4.3.RELEASE & Hibernate 4.3.0.Final)。按照在线示例进行配置后,应用程序抛出异常。Hibernate 4.3.0.Final&Spring Data JPA 1.4.3.RELEASE

<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 

我不能设法得到这种配置工作。我发现的唯一解决方法是将休眠恢复到版本4.2.8.Final

回答

19

您的类路径显然包含JPA 2.0和JPA 2.1 JAR,前者首先被发现,从而导致Hiberate失败。从你列出的依赖声明中不清楚为什么,因为Spring Data JPA 1.4.3肯定没有把它拉进去。

所以我建议尝试mvn dependency:tree,看看JPA 2.0 JAR和谁传递性依赖于它(也许你甚至已经在本地声明了它)。如果您仍然坚持使用它,请随时将Maven命令的输出添加到您的问题中。

+1

JPA 2.0可能会被应用程序服务器拉到,例如它是一个Jboss 7.1。 – andreadi

+0

我已经从我的项目中排除了jpa 2.0比它的诀窍。+1 –

+0

嗨@ismailyavuz,你能告诉我们如何从项目中排除jpa 2.0吗? – danisupr4

0

如果您确实使用eclipse,您可以在eclipse中打开pom.xml并导航到dependency heirarchy选项卡,以验证哪个jar被拾取为传递依赖项,哪个是您已配置的。你将不得不选择一个是传递依赖关系,并删除当前指定的依赖关系/ OR /你必须排除传递依赖关系。

enter image description here

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

在spring-data-jpa 1.4.3.RELEASE依赖项中排除hibernate-jpa-2.0-api –

0

我用

编译 'org.hibernate.javax.persistence:休眠,JPA-2.1-API:1.0.0.Final'

来解答它。

2

如果你使用JBoss Web服务器,你想排除的pom.xml休眠,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. 创建/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> 
    

-Enjoy!

0

我们面临同样的问题。我们有一个使用Spring和Hibernate 4.3.10.FINAL和JBoss 7.1.3的Web应用程序。 Hibernate带有JPA 2.1和带有JPA 2.0的JBoss。这两者在部署应用程序时发生冲突。 你有很多解决方案。正如其他人所说的那样,你可以将你想要的hibernate-jpa jar版本放在jboss的modules目录下(jboss/modules/javax/persistence/api/main),并用正确的版本更新modules.xml。 另一个解决方案(我们选择的)是在部署时防止JBoss隐式加载JBoss JPA。在这种情况下,你必须创建一个文件名为jboss的部署,structure.xml在WEB-INF folder.And添加排除象下面这样:

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

运行到与JBoss EAP 6.4,JPA同样的问题后, 2.1,弹簧引导1.4.1,春数据1.10.3,休眠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添加排除

相关问题