使用拦截器在休眠状态下使用新值和旧值进行审计跟踪
我可以轻松地记录上次修改日期、修改者等。但是,我也需要记录旧值和新值。在拦截器中,我可以在 postflush 开始执行之前触发一个 select 以获取当前记录的值。然后我可以在该记录和新记录之间进行比较,以查看发生了什么变化,并将该信息记录为旧值和新值。有更好的办法吗?
问题是我要修改的对象可能非常巨大,并且还引用其他对象。进行 diff 可能会很昂贵。
-谢谢
I can easily log last modified date, modified by etc. However, I need old and new value to be logged too. In the interceptor, I can fire a select before postflush starts executing to get the value of the current record. Then I can run a diff between this record and the new one to see what changed and log that information as old and new values. Is there a better way?
The problem is my object to be modified can be really huge with references to other objects too. Doing a diff can be expensive.
-thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
重写 EmptyInterceptor(IInterceptor) 的 onFlushDirty 为您提供数组 previousState 和 currentState。您可以使用这两个数组来查找旧值和新值。
查看此示例
Overriding onFlushDirty of EmptyInterceptor(IInterceptor) gives you arrays previousState and currentState. You can use these two arrays to find the oldvalue and newvalue.
look at this example
为什么不使用审计表和触发器?
Why not use audit tables and triggers?
您可以尝试 Envers ,它现在是 Hibernate 的一部分: http://www.jboss.org/envers
You can try Envers , whichis now part of Hibernate: http://www.jboss.org/envers
我以这种方式审核,但日期很难看:
persistence.xml:
property name="hibernate.ejb.interceptor" value="siapen.jpa.interceptor.MeuInterceptador" />
I audit this way, but dates are ugly:
persistence.xml:
property name="hibernate.ejb.interceptor" value="siapen.jpa.interceptor.MeuInterceptador" />
对于那些使用 Envers 的人来说,这可以使用自定义 Envers 侦听器轻松实现。而且它可能会是一个更干净的解决方案。
For those using Envers this can be easily implemented using custom Envers listeners. Also it'll be probably bit cleaner solution.