创建名为’entityManagerFactory的bean时出错

我试图运行dbtest但我收到以下错误:

“引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[root-context.xml]中定义名称为’entityManagerFactory’的bean创建错误:init方法的调用失败;嵌套exception是java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax /持久/ ValidationMode;”

因此我也得到以下错误:

“引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[root-context.xml]中定义了名为’personRepository’的bean创建错误:bean的初始化失败;嵌套exception是org.springframework.beans.factory .BeanCreationException:在类路径资源[root-context.xml]中定义名称为’entityManagerFactory’的bean时出错:init方法的调用失败;嵌套exception是java.lang.AbstractMethodError:org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo .getValidationMode()Ljavax /持久/ ValidationMode;

所以我们必须对我的根上下文文件进行检查,它看起来如下:

  <!-- Root Context: defines shared resources visible to all other web components  -->                   

persisence.xml看起来如下:

   org.hibernate.ejb.HibernatePersistence        

这是我的pom.xml文件:

   4.0.0 se.lowdin civilforsvaret civilforsvaret-webbapp war 1.0.0-BUILD-SNAPSHOT  1.6 3.1.1.RELEASE 1.6.10 1.6.6     org.springframework spring-context ${org.springframework-version}    commons-logging commons-logging     org.springframework spring-webmvc ${org.springframework-version}    org.aspectj aspectjrt ${org.aspectj-version}    mysql mysql-connector-java 5.1.24    org.slf4j slf4j-api ${org.slf4j-version}   org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime   org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime   log4j log4j 1.2.15   javax.mail mail   javax.jms jms   com.sun.jdmk jmxtools   com.sun.jmx jmxri   runtime    javax.inject javax.inject 1    javax.servlet servlet-api 2.5 provided   javax.servlet.jsp jsp-api 2.1 provided   javax.servlet jstl 1.2    junit junit 4.7 test   org.easymock easymock 3.1   org.hibernate hibernate-entitymanager 4.3.0.CR1   com.h2database h2 1.3.174   org.springframework spring-test 3.2.5.RELEASE   org.springframework spring-jpa 2.0.8   org.springframework spring-jdbc 3.2.5.RELEASE   org.springframework.data spring-data-jpa 1.4.2.RELEASE   org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final      maven-eclipse-plugin 2.9   org.springframework.ide.eclipse.core.springnature   org.springframework.ide.eclipse.core.springbuilder  true true    org.apache.maven.plugins maven-compiler-plugin 2.5.1  1.6 1.6 -Xlint:all true true    org.codehaus.mojo exec-maven-plugin 1.2.1  org.test.int1.Main      

我是Spring MVC的完整菜鸟,无法找到问题所在。

这听起来像是ClassLoader冲突。 我敢打赌你在类路径上有javax.persistence api 1.x,而Spring正试图访问ValidationMode ,这只是在JPA 2.0中引入的。

既然你使用Maven,那么做mvn dependency:tree ,找到工件:

  javax.persistence persistence-api 1.0  

并从您的设置中删除它。 (请参阅排除依赖项 )

AFAIK没有JPA 2的这种通用发行版,但你可以使用这个特定于Hibernate的版本:

  org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final  

好吧,因为那不起作用,你似乎仍然在那里有一些JPA-1版本。 在测试方法中,添加以下代码:

 System.out.println(EntityManager.class.getProtectionDomain() .getCodeSource() .getLocation()); 

看看它指向你的地方并摆脱那件神器。


啊,现在我终于看到了问题。 摆脱这个:

  org.springframework spring-jpa 2.0.8  

并替换它

  org.springframework spring-orm 3.2.5.RELEASE  

另外,您应该将所有测试库(spring-test,easymock等)设置为

 test 

添加依赖项并没有解决我的问题。

问题发生在我的最后,因为“附加”字段是“@Entity”类的一部分,并且在数据库中不存在。

我删除了@Entity类中的其他字段并且它有效。