我在尝试为使用直接 sql 查询在单个事务中更新数据库的 hibernate DAO 编写测试代码的验证部分时遇到了相当大的挫折。
背景:
@Transactional/JpaTransactionManagerSession直接与对象交互。情况:我有一个使用 NamedQuery 执行直接 SQL/HQL 更新的 DAO。以这种方式执行更新(而不是调用entityManager.persist)的主要驱动程序是分离对象的问题。我不想重新获取对象只是为了坚持保存我对它的更改。对象被分离的原因是因为它被缓存了。
我想编写一个单元测试来调用该 DAO 的 update 方法,然后调用 DAO 的 find 方法从数据库中拉回新鲜的对象,以验证更改是否正确。另一个问题是我希望这个单元测试在事务(即 的子类)中运行,AbstractTransactionalTestNGSpringContextTests以便回滚更改并保持状态干净以供下一个测试。
问题的关键:当我在执行更新后调用 DAO 上的 find 方法时,Hibernate 显然对已发生的更改一无所知。我认为这是由于一些缓存或休眠中的某些原因导致它由于某种原因无法获取这些更改。我试图寻找这个缓存并使其无效;到目前为止还没有成功。
例子:
@Test
public void testUpdate() {
SomeUser obj = makeSomeUser("joe");
// update the name using a NamedQuery; does not call `persist`
dao.updateName(obj.getId(), "bob");
SomeUser found = …Run Code Online (Sandbox Code Playgroud)