2

我试图弄清楚为什么@Transactional 在每次测试后不会回滚 envers 审计表中的数据以及如何修复它。我怎样才能在春季集成测试中做到这一点?

我已经尝试过使用@DirtiesContext,这使它可以工作,但它是一种解决方法,并且使测试运行的时间更长,这是我不喜欢的。

你们中有人知道如何使它工作吗?

4

1 回答 1

2

Hibernate Envers 充当事务提交时间审计解决方案。这最终意味着检查事务期间发生的所有持久性更改,并将一组工作单元操作缓存在内存中。简而言之,Envers 将操作刷新到审计模式的唯一时间是在成功事务提交之前。

那么从 Hibernate 的角度来看,这一切是如何工作的呢?

当检测到对审计实体进行操作的事务时,Hibernate Envers 向 Hibernate ORM 注册 2 个非常关键的回调操作,即事务完成之前之后的回调。before回调实际上执行对审计表的审计更改的刷新,而after负责清理与事务相关的任何资源分配。

只有当休眠事务协调器被要求提交事务时才会真正发生before回调。如果在请求提交时事务已被标记为回滚,则跳过之前的回调。

无论事务状态如何,after 回调总是发生

似乎可能发生的@Transactional是创建事务边界,然后调用该方法以执行其操作,当该方法退出时,注释会强制事务提交导致观察到的行为。

我可以为您看到几个选项:

  1. 将测试的事务行为覆盖为只读
  2. 设计测试以在验证测试用例后清理其测试数据。
  3. 即使表中存在现有测试数据,也可以设计测试。
  4. 如果不需要作为集成测试的一部分,则通过配置禁用 Envers。
于 2019-04-08T16:48:13.643 回答