我知道我可以创建Pre/Post Insert/Update/Delete侦听器,并且我可以记录这些事件,但考虑到来自多个线程的多个事务可以同时运行,我不确定如何将它们分组在一起,或者确定我已完成捕获所有这些事务。
我也知道我可以监听事务何时完成,但由于上述问题,我不确定如何确定该事务中包含哪些更改。
我已经在使用envers来创建审计,并使用自定义修订类来向REVINFO记录添加字段,如果这有帮助的话。
有没有我缺少的休眠机制可以帮助解决这个问题?
编辑:
我实际想做的是:在事务完成后(希望由spring/hibernate/envers触发(,迭代所有修改(我认为envers可以通过其事件提供这一点,我很乐意将这些记录在由事务ID键控的地方(,然后写一个更改为SQS的摘要。
假设您正在使用Envers,我实际上会考虑将报告生成步骤与当前应用程序完全解耦。这给了你几个优势:
- Hibernate事务不会涉及任何超出必要的步骤,因此提交速度更快
- 分离关注点,您的报告生成是完全独立的
- 使用轮询/推送机制,重试逻辑变得非常简单
当然,你可以把这一切综合起来,但我相信管理这些点会变得困难得多,但最终决定权在你。
在下面的解释中,我假设轮询/推送是在一个单独的应用程序中完成的。这个想法是,这个单独的应用程序包含了应用程序实体映射(或者至少是感兴趣的映射(。
首先,我建议REVINFO
的修订实体映射也跟踪修改后的实体类型。这将在以后生成报告时非常有用,因为我们可以将实体类型与修订号相结合,并在此基础上获取修订。
其次,单独的应用程序被设计为跟踪处理的最后修订号。每次启动应用程序的轮询/推送序列时,应用程序都会查看是否有任何新的修订,如果有,则会进行处理;否则,它将等待,然后再次轮询。
这个概念的总体思路是:
- 获取自上次修订编号以来的所有修订实体实例
- 迭代每个修订实体并。。。
- 对于修订中修改的每个实体类型,按修订实体版本号获取更改
- 对于在修订中修改的每个图元类型,请先获取修订
- 对两个java实例执行diff(使用JaVers等(
- 记录所有差异后,将报告发送给SQS