有没有一种方法可以捕获所有休眠更改,并按事务分组



我知道我可以创建Pre/Post Insert/Update/Delete侦听器,并且我可以记录这些事件,但考虑到来自多个线程的多个事务可以同时运行,我不确定如何将它们分组在一起,或者确定我已完成捕获所有这些事务。

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

我已经在使用envers来创建审计,并使用自定义修订类来向REVINFO记录添加字段,如果这有帮助的话。

有没有我缺少的休眠机制可以帮助解决这个问题?

编辑:

我实际想做的是:在事务完成后(希望由spring/hibernate/envers触发(,迭代所有修改(我认为envers可以通过其事件提供这一点,我很乐意将这些记录在由事务ID键控的地方(,然后写一个更改为SQS的摘要。

假设您正在使用Envers,我实际上会考虑将报告生成步骤与当前应用程序完全解耦。这给了你几个优势:

  • Hibernate事务不会涉及任何超出必要的步骤,因此提交速度更快
  • 分离关注点,您的报告生成是完全独立的
  • 使用轮询/推送机制,重试逻辑变得非常简单

当然,你可以把这一切综合起来,但我相信管理这些点会变得困难得多,但最终决定权在你。

在下面的解释中,我假设轮询/推送是在一个单独的应用程序中完成的。这个想法是,这个单独的应用程序包含了应用程序实体映射(或者至少是感兴趣的映射(。

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

其次,单独的应用程序被设计为跟踪处理的最后修订号。每次启动应用程序的轮询/推送序列时,应用程序都会查看是否有任何新的修订,如果有,则会进行处理;否则,它将等待,然后再次轮询。

这个概念的总体思路是:

  1. 获取自上次修订编号以来的所有修订实体实例
  2. 迭代每个修订实体并。。。
    • 对于修订中修改的每个实体类型,按修订实体版本号获取更改
    • 对于在修订中修改的每个图元类型,请先获取修订
    • 对两个java实例执行diff(使用JaVers等(
  3. 记录所有差异后,将报告发送给SQS

相关内容

  • 没有找到相关文章

最新更新