【问题标题】:Easy way to save basic auditing data on domain objects?在域对象上保存基本审计数据的简单方法?
【发布时间】:2011-03-12 15:19:24
【问题描述】:

我的应用程序使用大型域对象树,对于大多数这些对象,我想保留一些基本信息(更新者、修改时间等)。我已经将这些属性和列添加到我的应用程序中。

当我想到持久层应该透明地处理这个问题时,我正要在所有各种构造函数等中编写这些值的设置。

但是怎么做呢?

我当然可以在我的 DAO 中执行此操作,但是如何处理通过级联保存保留的对象?有没有办法拦截这些persist() 方法?

实现此功能的好方法是什么?

【问题讨论】:

    标签: java jpa persistence dns audit


    【解决方案1】:

    您可能想看看Hibernate Envers.

    【讨论】:

    • 哇——Envers 太棒了。我以前怎么没听说过?会认真考虑的。
    【解决方案2】:

    如果您打算使用 JPA 进行审计,您可以依赖 PrePersist 和 PreUpdate 回调注解。 JPA WikiBook has one such example。在这种情况下,拥有一个映射的超类非常有帮助,否则您将继续通过“用户”空间代码执行此操作。

    另一种方法是在表上使用触发器 (ahem)。不过,这确实会对性能产生影响。 Openbravo ERP project 似乎正在使用这种方法来生成审计跟踪。

    更新:最好将审计功能分离到一个不同的类中,而不是域模型的超类。 JPA 事件侦听器将帮助您实现相同的目标。 here 就是一个很好的例子。

    【讨论】:

    • 纯 JPA 的优点。感谢您提供有关 PrePersist 和 PreUpdate 的提示和链接。至于将所有审计信息存储在一个表中的想法,感觉就像一个潜在的性能瓶颈......不是吗?
    • 嗯,这是一个有趣的问题;答案将取决于您在单个表中存储的内容以及查询它的频率。如果您希望用户在正常操作过程中查询和查看审计信息的次数相对较多,那么您最好分别对每个实体进行审计。但是,如果审计表或多或少是一个 SELECT-only 表,那么它必然会受到更少的伤害,因为从性能角度来看,您只需要担心 INSERT。我认为需要进行一些容量规划,以预测生产中的条目数量。
    • 在我的特殊情况下,大部分时间都会有很多更新和查询此信息,因此我将继续将其存储在与实体相同的记录中。但是,我有一些地方可以将这些信息外部化会有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多