【问题标题】:JUnit Testing JPA With Hibernate Provider (java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo...)使用 Hibernate Provider 的 JUnit 测试 JPA (java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo...)
【发布时间】: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


    【解决方案1】:

    所以我修复它的方式,因为在 Maven 方面似乎没有任何工作(我放置的范围没有改变任何东西,javaee-api 总是在类路径中解析 before hibernate-jpa)我手动下载并添加了 JUnit 测试的类路径中的 jar,将它们放在 Maven 依赖项之前......这并不漂亮,但它可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2012-07-23
      • 2014-06-21
      • 2023-03-06
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多