我遇到了一个问题,我正在尝试为使用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数据库的其他设置以尝试消除任何缓存。
答案 0 :(得分:0)
事实证明,问题是如何在JPA中处理批量更新所固有的。它们不会像人们期望的那样更新持久性缓存。因此表格已正确更新,但是当对象被重新查询时,它没有更新。这就是为什么我的测试失败(一切都在同一个事务中)并且我部署的代码工作(执行更新和重新查询数据的单独事务)。