【问题标题】:Tracking changes to db fields while using ORM在使用 ORM 时跟踪对 db 字段的更改
【发布时间】:2011-06-02 22:35:35
【问题描述】:

我想跟踪对特定表中每一列所做的更改。我想用以下列将更改存储在另一个表中:id, field, and data 其中field(字符串值)是目标表中已更改的列,data 是该字段的新值。

在返回数据集时,我想到了从目标表中获取原始数据,并从跟踪变化的表中获取变化的值,然后使用java的反射能力将变化字段的值设置为最新的变化值。

基于以上,我有以下问题:

  1. 我的方法有意义吗?有没有更好的方法来达到预期的效果?
  2. 我正在使用 JPA 2 处理 ORM,是否有任何 ORM 功能有助于实现最终目标?

谢谢

【问题讨论】:

    标签: java database orm jpa


    【解决方案1】:

    你的方法很好。您可能需要许多“数据”字段来涵盖各种数据类型(例如日期、文本、长文本)。

    我要解决这个问题(但也很容易提供回滚功能)是使用xstream 和文本差异引擎。我使用 xstream 来获取 pojo 的 xml 快照,然后应用用户的编辑,然后再获取另一个。我区分这两个快照并存储差异文本。此外,通过一些努力,我可以以 wiki 样式漂亮地打印修改。

    【讨论】:

    • 这就是我的想法。您使用了哪个文本差异引擎?它在 Java 中可用吗?如果 xstream 的 xml 输出超过 1MB,性能如何?谢谢。
    【解决方案2】:

    检查 Hibernate 环境和 Eclipselink 历史会话以进行实体审计。 JPA 2.0 规范没有与实体审计相关的任何内容..

    【讨论】:

    • 如果您使用的是 Hibernate,您绝对应该查看 envers。它可以很容易地使用 hibernate 的事件机制进行集成,并且不需要太多的设置。 Envers 非常强大,可以处理完整对象图的审计。此外,它还使查询历史数据变得容易。
    • & @Thomas:因为我使用休眠作为底层实现,所以我研究了 Envers,它完全符合我的要求。感谢您的提醒。
    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2012-01-02
    • 2018-01-18
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多