【发布时间】:2019-10-23 18:47:17
【问题描述】:
我知道我可以创建 Pre/Post Insert/Update/Delete 侦听器,并且我可以记录这些事件,但鉴于来自多个线程的多个事务可以同时运行,我不确定如何进行分组他们一起或确定我已经完成了所有的捕获。
我也知道我可以监听事务何时完成,但由于上述问题,我不确定如何识别该事务中包含哪些更改。
如果有帮助,我已经在使用 envers 来创建审核并使用自定义修订类来向 REVINFO 记录添加字段。
是否有我缺少的休眠机制可以帮助解决这个问题?
编辑:
我实际上想要做的事情:事务完成后(希望由 spring/hibernate/envers 触发),遍历所做的所有修改(我认为 envers 可以通过它的事件提供这个,我很高兴记录这些地方由事务 ID 键入),然后写一个对 SQS 所做更改的摘要。
【问题讨论】:
-
它有点宽泛。你想存储什么?您可以使用绑定到当前执行线程的
ThreadLocal来基于每个线程存储数据。 baeldung.com/java-threadlocal。如果这是 webapp,请确保您已将 ThreadLocal 上下文清除为请求生命周期中的某个合适点,因为服务器可能会重用池中的线程。 -
这绝对是一个选择。我想我希望的是,如果 envers 可以写入 100 条审计记录并将它们分组到单个 REV,我是否可以在插入/更新/删除侦听器中捕获该 REV?
-
我更新了这个问题,详细说明了我想要实现的目标。
-
事件监听器拥有对象的新旧状态。制作差异应该很容易做到。但是既然你已经在使用 envers 为什么不使用它呢?或者使用 JaVers 之类的东西为新旧版本创建差异。
-
我已经想了一晚上,我想我太专注于让 spring/hibernate 为我将更改分组到事务中(或提供事务 ID)。我认为最好将事件更改流式传输到某处并创建我自己的批处理/分组。
标签: spring hibernate spring-transactions hibernate-envers