我有两个实体列表:一个是数据库中行的当前状态,另一个是对列表所做的更改。如何审核已删除、添加的行以及对实体所做的更改?我的审计表被所有实体使用。
实体侦听器和回调方法看起来非常合适,直到您注意到这句话:回调方法不得调用 EntityManager 或 Query 方法! 由于这个限制,我可以收集审计,但我不能将它们保存到数据库:(
我的解决方案是发现审计的复杂算法。
If the entity is in the change list and has no key, it's an add
If the entity is in the db but not the changes list, it's a delete
If the entity is in both list, recursively compare their fields to find differences to audit (if any)
我收集这些并在合并更改列表的同一事务中将它们插入数据库。但我讨厌我手写这个事实。似乎 JPA 应该能够为我做这个逻辑。
我们提出的一种解决方案是使用将审计发布到 JMS 队列的实体侦听器。然后队列将审计插入数据库。但我不喜欢这种解决方案,因为我认为设置 JMS 队列很痛苦。这是目前我们所拥有的最佳解决方案。
我正在使用 eclipselink(理想情况下,这不相关)并且发现这两件事看起来很有帮助,但 JMS 队列是比它们更好的解决方案:
- http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_what_changed_in_an_object_or_transaction.3F这看起来真的很难使用。您通过字符串搜索字段。因此,如果我重构我的实体并忘记更新它,它将引发运行时错误。
- http://wiki.eclipse.org/EclipseLink/Examples/JPA/History这与我们目前审计的方式不一致。它需要一个特殊的
entity_history
表。