有没有办法捕获所有休眠更改,并按事务分组?

时间:2019-10-23 18:47:17

标签: spring hibernate spring-transactions hibernate-envers

我知道我可以创建前/后插入/更新/删除侦听器,并且可以记录这些事件,但是鉴于可以同时运行多个线程的多个事务,因此我不确定如何分组他们在一起,或者确定我已经捕获了他们全部。

我也知道我可以在事务完成时收听,但是由于上述问题,我不确定如何确定该事务中包含哪些更改。

如果有帮助,我已经在使用envers创建审核,并使用自定义修订类以便将字段添加到REVINFO记录中。

我缺少冬眠的机械装置吗?

编辑:

我实际上想做的是:事务完成后(希望由spring / hibernate / envers触发),遍历所有已进行的修改(我认为envers可以通过其事件来提供此信息,我很乐于记录这些以交易ID为关键字的位置),然后写出更改为SQS的摘要。

1 个答案:

答案 0 :(得分:1)

鉴于您正在使用Envers,我实际上会考虑完全将报告生成步骤与当前应用程序脱钩。这为您带来了许多优势:

  • 休眠事务不会涉及多余的步骤,因此它们的提交速度更快。
  • 关注点分离,您的报告生成是完全独立的。
  • 通过轮询/推送机制,重试逻辑变得非常简单。

您当然可以将所有内容汇总为一个,但是我认为管理这些观点变得更加困难,但是最终的决定权是您自己决定的。

在以下说明中,我将假定轮询/推送是在单独的应用程序中完成的。这个想法是,这个单独的应用程序包含应用程序实体映射(或至少包含感兴趣的实体)。

首先,我建议REVINFO的修订实体映射也应跟踪已修改的实体类型。稍后在生成报告时,这将非常有用,因为我们可以将实体类型与修订版本号结合使用,并基于此获取修订。

第二,单独的应用程序旨在跟踪最近处理的修订号。每次应用程序的轮询/推送序列触发时,应用程序都会查看是否有任何新修订,如果有,将对其进行处理;否则,它将进行处理。否则它将等待,然后再次轮询。

该概念的总体思路是:

  1. 获取自上一个修订号以来的所有修订实体实例
  2. 迭代每个修订实体并...
    • 对于修订中修改的每个实体类型,请按修订实体修订号获取更改
    • 对于修订中修改的每种实体类型,先获取修订
    • 对两个java实例进行比较(使用JaVers等)
  3. 记录所有差异后,将报告发送至SQS