创建名为’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类中的其他字段并且它有效。