我正在开发基于JSF的Web应用程序,其中包含支持bean和Hibernate以实现持久性。
目标是实现一个功能来比较版本之间的变化,其中一些属性来自"外键"对象。为了获得通用解决方案,最好的方法是创建一种数据库触发器或其他东西。
我知道@Version
注释,但我不想只了解持久对象的历史记录,还要了解相关对象的历史记录。
任何人都已经做过类似的事了吗?
编辑:要在此处指定问题,请提供更多详细信息。该应用程序有很多业务对象,其中大多数只有简单的文本属性,如字符串。应用程序的主要功能是CRUD。我想构建一个功能,用户可以比较旧版本业务对象的版本。我的第一个想法是在业务对象的表中创建一个版本列,并始终保存带有新版本的新数据集。但这对我来说似乎是一个巨大的超载,以保存重复的一切。以及如何保持版本化对象之间的关联?那还有另一个更轻的一个吗?此方法还意味着更改每个数据库访问类和保存方法。
答案 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为每个版本化/带注释的实体创建一个审计表。您所要做的就是在可审计实体中设置注释。将生成所需的表格,并且还将管理相关审计实体的历史记录。因此,您可以重新创建实体的全部内容。