2

我有两个实体列表:一个是数据库中行的当前状态,另一个是对列表所做的更改。如何审核已删除、添加的行以及对实体所做的更改?我的审计表被所有实体使用。

实体侦听器和回调方法看起来非常合适,直到您注意到这句话:回调方法不得调用 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 队列是比它们更好的解决方案:

4

1 回答 1

0

EntityListener 看起来是一个不错的方法,因为您可以收集审计信息。

您是否尝试过将信息保存在与保存更改不同的事务中?可能获得对无状态 EJB 的引用(假设您正在使用 EJB)并使用标有 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 的方法。这样,在审计事务完成时,保留原始更改的事务将被搁置。请注意,您将无法访问此单独审计事务中的更新信息,因为原始事务尚未提交。

于 2013-05-10T21:48:32.260 回答