Cucumer/Arquillian 使用 H2 测试的不合逻辑结果

Illogical Results from Cucumer/Arquillian Test with H2

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

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

请注意:当我在我的应用程序中针对我们的 Oracle 数据库执行服务调用时,它工作正常并且 table 按预期更新。问题似乎与内存数据库中的 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>

我的 Cucumber 测试定义了 @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 数据库的哪些其他设置以尝试消除任何缓存。

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