【发布时间】:2018-07-20 17:49:51
【问题描述】:
我正在尝试为将 JPA 与 Hibernate 提供程序一起使用的应用程序编写 JUnit 测试。
在应用程序中实例化 JPA 上下文 Bean 的方式是通过在服务器资源 (Tomcat) 中定义的 JNDI 名称。在使用 JUnit 进行测试时,我无法做到这一点,因此我必须为 JPA 提供适合运行测试的不同上下文。
为一个被编写成打包在 WAR 中并在“服务器容器”中运行的应用程序编写 JUnit 测试时的主要问题是,您必须将 javaee-api jar 替换为 API 的实际实现,我理解那部分。
我用:
@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>
而且效果很好。
现在我尝试为“测试上下文”执行此操作的方式是失败关闭,如下所示:
<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>
...看起来不错,但我得到了例外:
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>
可能比使用更好
<provider>org.hibernate.ejb.HibernatePersistence</provider>
我以为我找到了问题,但并没有解决它...
所以我真的不知道现在还能做什么......
这是我在 POM 中使用的 Hibernate-Dependencies:
<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>
我也尝试评论第一个,但没有成功。
我非常感谢有关此问题的任何帮助或指示...
谢谢,祝你有美好的一天:)
【问题讨论】:
标签: java spring hibernate jpa provider