JUnit使用Hibernate提供程序测试JPA(java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo…)
我正在尝试为使用JPA和Hibernate提供程序的应用程序编写JUnit测试 在应用程序中实例化JPA上下文bean的方式是通过服务器资源(Tomcat)中定义的JNDI名称。在使用JUnit进行测试时,我不能这样做,因此我必须为JPA提供一个适合运行测试的不同上下文 在为一个应用程序编写JUnit测试时,主要的问题是您必须用api的实际实现替换JavaEEAPI jar,我理解这一部分 我使用:JUnit使用Hibernate提供程序测试JPA(java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo…),java,spring,hibernate,jpa,provider,Java,Spring,Hibernate,Jpa,Provider,我正在尝试为使用JPA和Hibernate提供程序的应用程序编写JUnit测试 在应用程序中实例化JPA上下文bean的方式是通过服务器资源(Tomcat)中定义的JNDI名称。在使用JUnit进行测试时,我不能这样做,因此我必须为JPA提供一个适合运行测试的不同上下文 在为一个应用程序编写JUnit测试时,主要的问题是您必须用api的实际实现替换JavaEEAPI jar,我理解这一部分 我使用: @ContextConfiguration(locations = { "classpath
@ContextConfiguration(locations = { "classpath:context-config-test.xml" })
告诉Spring为测试设置不同的上下文配置XML
现在,真正的问题是:我正在尝试设置一个使用Hibernate作为“持久性提供者”的EMF(EntitiManagerFactory)。
“正常上下文”的工作方式是:
<bean id="MyEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="my_pu_name" />
<property name="persistenceXmlLocation" value="classpath:jpa/persistence.xml" />
</bean>
然后在jpa/persistence.xml中:
<!-- spring with jta and entity manager factory -->
<persistence-unit name="my_pu_name" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/my_jndi_db_name</jta-data-source>
<properties>
....
</properties>
</persistence-unit>
org.hibernate.ejb.HibernatePersistence
jdbc/my_jndi_db_name
....
而且效果很好
现在,我尝试在“测试上下文”中使用faily close,如下所示:
<bean id="myEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDatasource"/>
<property name="persistenceUnitName" value="my_pu_name_test" />
<property name="persistenceXmlLocation" value="classpath:jpa/persistence-test.xml" />
</bean>
然后在jpa/persistence-test.xml中:
<persistence-unit name="my_pu_name_test" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<exclude-unlisted-classes/>
<properties>
.....
</properties>
</persistence-unit>
org.hibernate.ejb.HibernatePersistence
.....
。。。看起来不错,但我有个例外:
java.lang.IllegalStateException:未能加载ApplicationContext
原因:org.springframework.beans.factory.BeanCreationException:
创建名为“myEntityManagerFactory”的bean时出错
在类路径资源[spring/beans test.xml]中定义:调用
初始化方法失败;嵌套异常为java.lang.NoSuchMethodError:
javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode
我环顾四周,将Maven依赖项更改为指向Hibernate Core,这是JPA的一个实现,检查范围是否正常,诸如此类。。。但什么都没用。
环顾四周一段时间后,我发现
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
org.hibernate.jpa.HibernatePersistenceProvider
也许使用比
<provider>org.hibernate.ejb.HibernatePersistence</provider>
org.hibernate.ejb.HibernatePersistence
我以为我发现了问题,但这并没有解决它
所以我真的不知道现在还能做什么
以下是我在POM中使用的Hibernate依赖项:
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<!-- slf4j already contained in Tomcat -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<!-- slf4j already contained in Tomcat -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
org.hibernate.javax.persistence
hibernate-jpa-2.0-api
1.0.1.最终版本
运行时
org.slf4j
slf4j api
org.hibernate
冬眠核心
${hibernate.version}
测试
org.hibernate
冬眠核心
${hibernate.version}
org.slf4j
slf4j api
org.hibernate
休眠实体管理器
${hibernate.version}
org.slf4j
slf4j api
我也试着评论第一个,但没有效果
我非常感谢在这个问题上的任何帮助或指点
谢谢,祝你有一个愉快的一天:)所以我修复它的方式,因为在Maven方面似乎没有任何效果(我放置的范围没有改变任何东西,javaee api总是在hibernate jpa之前在类路径中解析),我手动下载并在JUnit测试的类路径中添加JAR,将它们放在Maven依赖项之前。。。虽然不漂亮,但它确实起了作用