【问题标题】:Hibernate Envers - get revisions and objects between datesHibernate Envers - 获取日期之间的修订和对象
【发布时间】:2019-05-30 07:22:10
【问题描述】:

考虑一辆有合同、修改、维护、经销商等的汽车...... 当合同中有更新时,您会找到 revision_idrevision_timestemp,如果您转到 contract_aud,您可以通过 reivsion_id 找到新版本。

我的目标是向最终用户提供一个他可以询问的查询:cars(复数)在 startDate 和 endDate 之间有哪些修订。请注意,修订可以在合同/维护/经销商等...(我只关心汽车的 ID)

根据我今天的情况,可以通过以下方式按日期查询:

    AuditReader auditReader = AuditReaderFactory.get(em);
    AuditQuery q = auditReader.createQuery().forRevisionsOfEntity(Car.class, false, true);
    q.add(AuditEntity.revisionProperty("timestamp").ge(startDate.getTime()));
    q.add(AuditEntity.revisionProperty("timestamp").lt(endDate.getTime()));

但您可以注意到,我发送的是 Car.class,如果在“contract”中进行了修订,我将不得不发送 Contract.class(以及稍后获取汽车的 ID)

我有 20 多个带有后缀 _AUD 的表,所以去数据库 20 次是没有意义的。

问题:如何查询日期和修订号之间发生的修订以及已更改的对象

【问题讨论】:

    标签: java hibernate audit hibernate-envers


    【解决方案1】:

    您可以尝试在修订实体中使用@ModifiedEntityNames 注释。

    这个link有一些细节(它没有被索引,搜索注释,你会找到它。)

    使用注释并不是那么简单,因为它会更改您正在使用的修订实体(即使它是提供的默认值或任何自定义)。

    它将创建一个与每个修订关联的集合,并且在此集合中将包含在相关修订中更改的实体名称。

    有了这些,您可以查询给定时间窗口内的修订,以及已更改的表。稍后您可以使用修订时间戳来更改事务中的每个实体。

    如果您仍处于开发阶段,那么它肯定会有所帮助,但如果您有一个正在运行的生产系统,那么它只会对未来的更改有用。

    【讨论】:

      【解决方案2】:

      一个经典的方法是编写一个带有左连接的简单 SQL 语句,为每个表提供日期和修订。目的仅仅是接收 CAR id,而不进行任何修订解释。

      SELECT ri.revision_id, ri.revision_timestamp, s.id supplier_id ...
      from revinfo as ri 
      left join ...
      left join... 
      where ri.revision_timestamp 
      between 1546530449341 and 1546532280293
      

      奥卡姆剃刀;-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 2014-03-02
        • 2017-11-28
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多