我试图弄清楚为什么@Transactional 在每次测试后不会回滚 envers 审计表中的数据以及如何修复它。我怎样才能在春季集成测试中做到这一点?
我已经尝试过使用@DirtiesContext,这使它可以工作,但它是一种解决方法,并且使测试运行的时间更长,这是我不喜欢的。
你们中有人知道如何使它工作吗?
我试图弄清楚为什么@Transactional 在每次测试后不会回滚 envers 审计表中的数据以及如何修复它。我怎样才能在春季集成测试中做到这一点?
我已经尝试过使用@DirtiesContext,这使它可以工作,但它是一种解决方法,并且使测试运行的时间更长,这是我不喜欢的。
你们中有人知道如何使它工作吗?
Hibernate Envers 充当事务提交时间审计解决方案。这最终意味着检查事务期间发生的所有持久性更改,并将一组工作单元操作缓存在内存中。简而言之,Envers 将操作刷新到审计模式的唯一时间是在成功事务提交之前。
那么从 Hibernate 的角度来看,这一切是如何工作的呢?
当检测到对审计实体进行操作的事务时,Hibernate Envers 向 Hibernate ORM 注册 2 个非常关键的回调操作,即事务完成之前和之后的回调。before回调实际上执行对审计表的审计更改的刷新,而after负责清理与事务相关的任何资源分配。
只有当休眠事务协调器被要求提交事务时才会真正发生before回调。如果在请求提交时事务已被标记为回滚,则跳过之前的回调。
无论事务状态如何,after 回调总是发生。
似乎可能发生的@Transactional
是创建事务边界,然后调用该方法以执行其操作,当该方法退出时,注释会强制事务提交导致观察到的行为。
我可以为您看到几个选项: