我有两个实体列表:一个是DB中行的当前状态,另一个是对列表所做的更改。如何审核已删除,添加的行以及对实体所做的更改?我的审计表由所有实体使用。
Entity listeners and Callback methods看起来非常合适,直到你注意到这句话:一个回调方法不能调用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队列是比它们更好的解决方案:
entity_history
表。 答案 0 :(得分:0)
由于您可以收集审核信息,因此EntityListener看起来是一种很好的方法。
您是否曾尝试将信息保留在与持续更改的事务不同的事务中?可能获取对无状态EJB的引用(假设您正在使用EJB)并使用标记为@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)的方法。通过这种方式,在审计事务完成时,保持原始更改的事务将被暂停。请注意,您将无法访问此单独审计事务中的更新信息,因为原始事务尚未提交。