使用H2进行Cucumer / Arquillian试验的不合逻辑结果

时间:2016-03-08 16:55:28

标签: jpa cucumber h2 jboss-arquillian

我遇到了一个问题,我正在尝试为使用JPQL执行批量更新的新服务创建Cucumber / Arquillian测试。除了验证更改的@Then代码外,一切似乎都能正常工作。

我正在我的功能文件中设置我的测试数据,并将其添加到每个测试在内存中创建的H2数据库中。批量更新运行时,它会根据该数据报告预期的更新计数。但是,当我检索应该更新的其中一个对象时,该对象上的数据似乎没有变化。

请注意:当我在我的应用程序中针对Oracle数据库执行服务调用时,它可以正常工作,并且表格会按预期更新。问题似乎是内存数据库中H2的缓存。

我的Arquillian部署到JBoss的数据源是:

<datasource enabled="true"
            jndi-name="jdbc/arquillian" 
            pool-name="ArquillianEmbeddedH2Pool">
   <connection-url>
      jdbc:h2:mem:arquillian;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS TEST_DB
   </connection-url>
   <driver>h2</driver>
</datasource>

我的黄瓜测试定义了@PersistenceContext(unitName = "localH2-testDB")

我的persistence.xml包含:

<persistence-unit name="localH2-testDB">
    <jta-data-source>jdbc/arquillian</jta-data-source>
    <properties>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        <property name="hibernate.cache.use_second_level_cache" value="false"/>
        <property name="hibernate.cache.use_query_cache" value="false"/>
    </properties>
</persistence-unit>

我不知道我可以更改H2数据库的其他设置以尝试消除任何缓存。

1 个答案:

答案 0 :(得分:0)

事实证明,问题是如何在JPA中处理批量更新所固有的。它们不会像人们期望的那样更新持久性缓存。因此表格已正确更新,但是当对象被重新查询时,它没有更新。这就是为什么我的测试失败(一切都在同一个事务中)并且我部署的代码工作(执行更新和重新查询数据的单独事务)。