代码之家  ›  专栏  ›  技术社区  ›  adhg veen

hibernate envers-获取日期之间的修订和对象

  •  0
  • adhg veen  · 技术社区  · 6 年前

    考虑一辆有合同,修改,保养,经销商等的车… 当合同中有更新时, 修订版 和A 修订时间温度 如果你去合同,你可以通过ReVixId找到新版本。

    我的目标是为最终用户提供一个查询,在那里他可以问:什么? 汽车 (复数)在开始日期和结束日期之间有修订。请注意,修订可以在合同/维护/经销商等……(我只关心汽车的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()));
    

    但是你可以注意到我发送 卡尔班 如果修订是在 合同 “我得把合同寄到班级(然后拿到车的身份证)

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

    问题:如何查询日期和修订号之间发生的修订和 对象 改变了。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Vitor Santos    6 年前

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

    这个 link 有一些详细信息(它没有索引,搜索注释,您会找到它。)

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

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

    有了这一点,您可以查询给定时间窗口中的修订,以及更改的表。之后,您可以使用修订时间戳来获取事务中更改的每个实体。

    如果您仍在开发中,那么它肯定会有帮助,但是如果您有一个生产运行系统,那么它只对将来的更改有用。

        2
  •  0
  •   adhg veen    6 年前

    一种经典的方法是编写一个带有左连接的简单sql语句,该语句为每个表提供日期和修订版。其目的仅仅是接收汽车识别码,而无需任何修改说明。

    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
    

    奥卡姆剃刀;-)