【问题标题】:How to persist all versions of an entity by JPA?如何通过 JPA 持久化实体的所有版本?
【发布时间】:2015-11-18 23:00:09
【问题描述】:

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

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

  1. 即使在编辑时也保留一个新的 PersonEntity。这样,所有版本的 PersonEntity 都在数据库中。我还应该,1)在 PersonEntity 中添加一个属性以指示它是否是最新的; 2) 创建或更新 PersonEntity 时,我需要设置该标志; 3) 更改所有查询方法,只获取最新的 PersonEntity。

在我看来,这不是一个好的选择,因为 3) 会导致大量代码更改,并且也会减慢查询速度。

  1. 创建具有与 PersonEntity 相同属性的新类,例如 PersonAuditEntity。创建或更新 PersonEntity 时,始终保持一个新的 PersonAuditEntity。

但是这样,两个相似的类同时存在。我最初的解决方案是简单地将 PersonEntity 包装到 PersonAuditEntity 中,但 JPA 似乎不支持将实体嵌入到另一个实体中。那正确吗?

任何其他建议将不胜感激。

【问题讨论】:

标签: java entity-framework hibernate jpa


【解决方案1】:

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

@Audited
private String name;

将记录实体名称属性的更改。

【讨论】:

    【解决方案2】:

    另一种选择。

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

    所有选择都需要使用额外的where子句“and inactive = false”

    【讨论】:

    • 感谢您的回答,但看起来这是我的第一选择。我需要在每个方法中添加这样的子句,并且我担心添加会导致性能下降。我说的对吗?
    • 是的,它与您的选项 1 相同。抱歉。它确实存在与您的数据库和行数相关的性能问题。如果你说的数千我不会担心,数百万将是一个问题。您还可以查看将旧数据复制到其他表的触发器,这与您的第二个选项有点相似。
    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2013-11-06
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多