我有一个 JUnit 测试,它对存储库层进行基本检查,从数据库中删除一个条目。
我使用 @DatabaseSetup 注释来提供初始配置,并使用 @ExpectedDatabase 来验证删除后数据库的内容。
以下是代码
@Test
@ExpectedDatabase(
table = "OBJECT_ALIAS",
value = "classpath:dbunit/data/object_alias_deleted_2115_ALIAS_5.xml")
public void testDeleteObjectAlias() {
ObjectAlias objectAlias = new ObjectAlias(2115, 5, "NewAlias");
objectAliasRepository.deleteObjectAlias(objectAlias);
//objectAliasRepository.findByPartyNo(5); //runs a select query on DB
}
上述测试失败,但如果我取消注释行,则测试通过。 我正在使用 eclipseLink 作为 JPA 提供程序。
是什么导致了这种行为?
我找到了解决方案。
这不是问题,而是 JPA 的行为/工作方式。执行任何数据库操作时,更改都会保留在一级缓存中,直到提交事务或显式刷新持久性上下文。
问题中的场景是因为当运行选择查询时,它导致 JPA 将更改刷新到数据库。
解决方案是在测试类中显式运行entityManager.flush(),以便将更改提交到数据库。