【问题标题】:Bi temporal audit data with JPA Envers使用 JPA Envers 的双时态审计数据
【发布时间】:2014-10-28 21:02:38
【问题描述】:

我们有一个使用双时态数据跟踪所有实体更改的应用程序。每个实体都有:

@Embeddable 
public class AuditInfo {
    private Date effectiveFrom;
    private Date effectiveTo;
    private Date asOf;
    private Boolean isCurrent;
}

但是,在更新实体时,我们希望插入一条新记录并使用 isCurrent = false 更新旧记录,并使用当前日期时间更新 EffectiveTo 日期。

我可以使用 Spring Jpa-Envers 实现这一点吗?

我尝试连接 Hibernate 拦截器,后来意识到我只能从拦截器中修改实体字段,除此之外无能为力。

我可以轻松添加一个服务层来实现这一点,但听起来它不属于服务,因为它是一个横切关注点。

我们正在玩的另一个是自定义存储库并覆盖 save() 方法。

不胜感激。

【问题讨论】:

    标签: hibernate-envers spring-data-envers


    【解决方案1】:

    Envers 中的旧版本实体存储在单独的表中。因此标记为isCurrent 毫无意义,因为主表中的内容是当前版本。如果更改了 EffectiveTo/effectiveFrom 字段,新的修订将被插入到审计表中。

    现在,如果具有不同生效日期的实体具有不同的身份,那么您应该将其简单地建模为单独的实体,而您只需 JPA。

    如果身份保持不变,这对 Envers 来说是一个很好的用例。

    【讨论】:

    • 当我们创建实体时,有效日期是未来(+100 年)。当一个实体被修改时,我们想用 effectiveTo=sysdate-1 更新旧版本,用 EffectiveFrom=sysdate 更新新版本。这使得查询实体在给定日期之间的有效日期变得更加容易。它也可以通过仅在实体上具有 EffectiveFrom 来实现,但这意味着查询要复杂得多。可以更新以前的版本吗?
    • 不,修订是不可变的。但在我看来,在您的情况下,不同版本的实体具有不同的身份,因此您应该简单地将其建模为单独的实体,并使用 JPA 进行查询。在这种情况下,Envers 不会给你太多。
    • 由于历史版本存储在单独的表中,并且当当前版本被移动时,必须有办法连接到此以修改修订数据?
    • 你可以通过覆盖 Envers 的听众来解决这个问题,但没有“官方”的方式来做到这一点。
    • 嗨,Adam,我喜欢 ValidityAuditStrategy 类提供的功能,但如果有一种方法可以确定开始修订和结束修订的日期,这可能吗?
    猜你喜欢
    • 2017-07-09
    • 2013-06-03
    • 2023-03-24
    • 2018-04-18
    • 2013-05-06
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多