使用Hibernate实现内容比较的版本控制功能的最佳方法是什么?

时间:2015-05-28 13:55:13

标签: java hibernate jpa

我正在开发基于JSF的Web应用程序,其中包含支持bean和Hibernate以实现持久性。

目标是实现一个功能来比较版本之间的变化,其中一些属性来自"外键"对象。为了获得通用解决方案,最好的方法是创建一种数据库触发器或其他东西。

我知道@Version注释,但我不想只了解持久对象的历史记录,还要了解相关对象的历史记录。

任何人都已经做过类似的事了吗?

编辑:要在此处指定问题,请提供更多详细信息。该应用程序有很多业务对象,其中大多数只有简单的文本属性,如字符串。应用程序的主要功能是CRUD。我想构建一个功能,用户可以比较旧版本业务对象的版本。我的第一个想法是在业务对象的表中创建一个版本列,并始终保存带有新版本的新数据集。但这对我来说似乎是一个巨大的超载,以保存重复的一切。以及如何保持版本化对象之间的关联?那还有另一个更轻的一个吗?此方法还意味着更改每个数据库访问类和保存方法。

2 个答案:

答案 0 :(得分:1)

我会解决这个问题:

  • 业务对象表,例如:EXAMPLE_TABLE

    -----------------------------------
    |ID         |column 1|column 2|...|
    |----------------------------------
    |1          |foo     |bar     |...|
    |2          |baz     |test    |...|
    |...        |...     |...     |...|
    -----------------------------------
    
  • 每个业务对象表的历史保存表,例如:EXAMPLE_TABLE_HISTORY

    ------------------------------------------------
    |ID         |column 1|column 2|...|version|date|
    |-----------------------------------------------
    |1          |null    |foo     |...|1      |    |
    |1          |baz     |test    |...|2      |    |
    |...        |...     |...     |...|...    |... |
    ------------------------------------------------
    

您可以在每个操作(INSERT,UPDATE或DELETE)上为EXAMPLE_TABLE定义数据库触发器,以将当前数据从EXAMPLE_TABLE复制到EXAMPLE_TABLE_HISTORY,包括版本(列{{1} }}和一个时间戳(列version)来保存历史记录。

优点:

  • 您可以使用历史记录保存表中的date列轻松检索业务对象的所有版本。
  • 使用触发器,您无需更改应用程序代码。

答案 1 :(得分:0)

我想我发现了我正在寻找的东西。事件虽然我想用db触发器解决它,但hibernate提供了一个非常好的解决方案。 Hibernate envers为每个版本化/带注释的实体创建一个审计表。您所要做的就是在可审计实体中设置注释。将生成所需的表格,并且还将管理相关审计实体的历史记录。因此,您可以重新创建实体的全部内容。