每个实体存储可审计字段

时间:2010-01-04 06:05:37

标签: hibernate database-design hibernate-envers audit-trail

我认为捕获可审核字段以跟踪特定实体发生的事情(比如createdBy,creationDate,modifiedBy,modifiedDate)是一个很好的做法

  1. 我假设如果一个对象永远不会被修改,那么只捕获SNMPv3事件的下列可审计字段(比如createdBy,creationDate)

  2. 我假设一个对象在多人创建之后是可修改的,例如用户配置文件可以由self或admin修改,那么捕获所有上述属性是有意义的(比如createdBy,creationDate,modifiedBy, modifiedDate)

  3. 假设不需要每个实体的审计跟踪历史记录,将所有可审计属性存储在实体本身中是否有意义

  4. 将审核委托给第三方框架(比如JBoss Envers - http://www.jboss.org/envers)是否有意义上述用例。

  5. 假设用户X创建并维护了一个实体(比如一个采购订单),用户Y对上述采购订单进行了一些改进。谁应该被标记为该实体的所有者(是创建者还是修饰符)。在这种情况下,creationDate可能根本不相关,所以在这里跟踪这个字段是否有意义。

  6. 注意:底层持久层基于JPA,Hibernate 3.3.x

1 个答案:

答案 0 :(得分:1)

(1)和(2)似乎是合理的,尽管将所有实体视为相同而不是将其与仅创建和创建/修改实体复杂化可能不会有害。

(3)将它们存储在实体上是最简单的,但我很想在审计数据中为每个实体设置一个表或表。如果您想存储多个修改,即完整的历史记录,这将为您提供灵活性。查询主要实体时可能会略微提升性能。

(4)Envers看起来既有趣又简单,但它似乎存储了完整的历史记录,并且您表示没有必要,所以它可能有点过分。

(5)我会说创建者始终是导致初始插入的人(或进程),而修饰符是导致更新的最后一个人/进程。如果您想对业主做出业务决策,请将其视为单独的字段,而不是审核解决方案的一部分。