如何通过JPA保留实体的所有版本?

时间:2015-11-18 23:00:10

标签: java entity-framework hibernate jpa

我正在审计一个实体的变化,比如PersonEntity。 现有代码支持创建或编辑人员的个人资料并持久保存相应的PersonEntity。如果编辑,它将更新数据库中的PersonEntity。它还支持基于诸如年龄的一些属性来获取人的查询。此外,它还提供API来设置“创建者”,“更新者”和“更新时间” - 通常它是可以审核的。

我的工作是通过持久保存PersonEntity的所有旧版本来使其更具可审计性。我想我有两个选择:

  1. 即使进行编辑,也要保留新的PersonEntity。这样,PersonEntity的所有版本都在数据库中。我还应该,1)在PersonEntity中添加一个属性来表明它是否是最新的; 2)在创建或更新PersonEntity时,我需要设置该标志; 3)将所有查询方法更改为仅获取最新的PersonEntity。
  2. 在我看来,这不是一个好的选择,因为3)会导致一堆代码更改,并且也会减慢查询速度。

    1. 创建一个与PersonEntity属性相同的新类,比如PersonAuditEntity。创建或更新PersonEntity时,始终保留一个新的PersonAuditEntity。
    2. 但是以这种方式,两个相似的类同时存在。我最初的解决方案是简单地将PersonEntity包装到PersonAuditEntity中,但似乎JPA不支持在另一个实体中嵌入实体。是对的吗?

      任何其他建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

你看过Hibernate ORM Envers了吗?这支持审核实体,例如:

@Audited
private String name;

将记录更改以命名该实体的属性。

答案 1 :(得分:0)

另一种选择。

添加一个新列,当该行替换为新行时,该列将设置为非活动状态。只添加新行,永不更新行。

所有选择都需要使用额外的where子句"和inactive = false"