Java 使用ORM时跟踪对db字段的更改

Java 使用ORM时跟踪对db字段的更改,java,database,orm,jpa,Java,Database,Orm,Jpa,我想跟踪对特定表中每一列所做的更改。我考虑将更改存储在另一个具有以下列的表中:id、field和data,其中field(字符串值)是目标表中已更改的列,data是该字段的新值 在返回数据集时,我考虑从目标表中检索原始数据,从跟踪更改的表中检索更改的值,然后使用java的反射功能将更改的字段值设置为最新更改的值 基于上述情况,我有以下问题: 我的方法有意义吗?有没有更好的方法来达到预期的效果 我正在使用JPA2来处理ORM,是否有任何ORM特性可以帮助实现最终目标 感谢您检查Hibernate

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

在返回数据集时,我考虑从目标表中检索原始数据,从跟踪更改的表中检索更改的值,然后使用java的反射功能将更改的字段值设置为最新更改的值

基于上述情况,我有以下问题:

  • 我的方法有意义吗?有没有更好的方法来达到预期的效果
  • 我正在使用JPA2来处理ORM,是否有任何ORM特性可以帮助实现最终目标

  • 感谢您检查Hibernate envers和Eclipselink历史会话以进行实体审核。。
    JPA 2.0规范没有任何与实体审核相关的内容

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


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

    如果您使用的是Hibernate,那么一定要查看envers。它可以使用hibernate的事件机制轻松地进行集成,并且不需要进行太多的设置。Envers功能非常强大,可以处理完整对象图的审核。另外,它使查询历史数据变得容易。&@Thomas:因为我使用hibernate作为底层实现,所以我研究了Envers,它正是我想要的。谢谢你的提醒,这就是我的想法。您使用了哪个文本差异引擎?它有Java版本吗?如果xstream的xml输出超过1MB,性能如何?非常感谢。