Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JUnit使用Hibernate提供程序测试JPA(java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo…)_Java_Spring_Hibernate_Jpa_Provider - Fatal编程技术网

JUnit使用Hibernate提供程序测试JPA(java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo…)

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

我正在尝试为使用JPA和Hibernate提供程序的应用程序编写JUnit测试

在应用程序中实例化JPA上下文bean的方式是通过服务器资源(Tomcat)中定义的JNDI名称。在使用JUnit进行测试时,我不能这样做,因此我必须为JPA提供一个适合运行测试的不同上下文

在为一个应用程序编写JUnit测试时,主要的问题是您必须用api的实际实现替换JavaEEAPI jar,我理解这一部分

我使用:

  @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依赖项之前。。。虽然不漂亮,但它确实起了作用