【问题标题】:Getting the old value and new value between two revisions with Hibernate Envers使用 Hibernate Envers 在两个修订版之间获取旧值和新值
【发布时间】:2013-07-08 18:42:39
【问题描述】:

这是Retrieve audited entities name, old value and new value of the given revision的后续问题

我已经弄清楚如何获得实体的两个修订版,但看不到任何容易找到两者之间的区别。 envers 中是否有任何东西可以帮助在不同的修订版中对实体进行差异化?或者有什么好的图书馆?

如果我能获得属性修改 (_mod) 字段字段,我会非常酷。

【问题讨论】:

    标签: java hibernate diff hibernate-envers auditing


    【解决方案1】:

    Envers 目前不支持此功能。您必须自己比较这些对象。

    【讨论】:

    • 如果有一种方法可以获取历史表中的 _mod 列,那就太好了。我发现手动比较不需要的字段,休眠延迟加载和集合是一个巨大的痛苦。也许到那时为止,手册中的一个例子会很棒。
    【解决方案2】:

    Envers API 更多用于查看历史记录。它不会告诉您发生了什么变化,但您可以获取两个修订版并查找差异。事实是,它不存储更改的内容,而是存储该实体在该时间点的所有字段。它必须比较每一个来找出差异,所以你需要编写那个代码。

    【讨论】:

      【解决方案3】:

      因此,为了让生活更轻松,我想出一个注释来标记我有兴趣比较的字段。没有我最终不得不坚持命名对话,就像只使用以“get”开头的方法一样。我发现这种方法有很多极端情况。

      注释。

      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.FIELD)
      public @interface AuditCompare {
      
          public String name() default "";
          public CompareType compareBy() default CompareType.string;
      
          enum CompareType {
              string, count
          }
      
      }
      

      使用起来像

      @Entity
      @Audited
      public class Guideline {
      
          .....
      
          @AuditCompare
          private String name;
      
          @AuditCompare
          private String owner;
      
          @OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, mappedBy="guideline")
          private Set<GuidelineCheckListItem> checkListItems = new HashSet<GuidelineCheckListItem>();
      
          .........
      
      }
      

      由于 envers 将 Set 更改和 set 的对象作为两个不同的事件进行审核,因此我不想在 set 更改时进行比较。然后进行比较,我的方法看起来像

      private void findMatchingValues(Object oldInstance, Object newInstance, ActivityEntry entry) {
          try {
      
              Class oldClass = oldInstance.getClass();
              for (Field someField : oldClass.getDeclaredFields()) {
                  if (someField.isAnnotationPresent(AuditCompare.class)) {
      
                      String name = someField.getAnnotation(AuditCompare.class).name();
                      name = name.equals("") ? someField.getName() : name;
      
                      Method method = oldClass.getDeclaredMethod(getGetterName(name));
      
                      if(someField.getAnnotation(AuditCompare.class).compareBy().equals(AuditCompare.CompareType.count)) {
                          int oldSize = getCollectionCount(oldInstance, method);
                          int newSize = getCollectionCount(newInstance, method);
                          if (oldSize != newSize) entry.addChangeEntry(name, oldSize, newSize);
      
                      } else {
                          Object oldValue = getObjectValue(oldInstance, method);
                          Object newValue = getObjectValue(newInstance, method);
                          if (!oldValue.equals(newValue)) entry.addChangeEntry(name, oldValue, newValue);
                      }
                  }
              }
      
          } catch (NoSuchMethodException e) {
              throw new RuntimeException(e);
          }
      }
      

      【讨论】:

      • 我想做一些非常相似的事情。
      猜你喜欢
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多