代码之家  ›  专栏  ›  技术社区  ›  Richard

Javers按顺序比较列表

  •  0
  • Richard  · 技术社区  · 6 年前

    我有两个类似这样的java类:

    public class FooA {
      private List<FooB> fooB;
    }
    
    public class FooB {
      private Integer id;
      private String name;
      private double num;
    }
    

    我想比较FooA,它告诉我列表对象中的哪些字段发生了变化。但当我这么做的时候:

    FooA old = new FooA(Arrays.asList(new FooB(1, "old", 1.0)));
    FooA new = new FooA(Arrays.asList(new FooB(1, "new", 1.0)));
    
    Javers javers = JaversBuilder.javers()
              .withListCompareAlgorithm(LEVENSHTEIN_DISTANCE)
              .build();
    
    javers.compare(old, new);
    

    它给了我这个区别:

    Diff:
    * new object: com.FooA/#fooB/1d32d18fcb3ba2f7f7cb41af6cd96b32
    * object removed: com.FooA/#fooB/223ef3c3249fe2898ac3354f9bf42620
    * changes on com.FooA/ :
      - 'fooB' collection changes :
        . 'com.FooA/#fooB/223ef3c3249fe2898ac3354f9bf42620' removed
        . 'com.FooA/#fooB/1d32d18fcb3ba2f7f7cb41af6cd96b32' added
    

    我甚至试着在FooB上添加一个Id,就像我在很多帖子中读到的那样。现在我的食物看起来像这样:

    public class FooB {
      @Id
      private Integer id;
      private String name;
      private double num;
    }
    

    但现在当我比较时,我得到了:

    Diff:
    * changes on com.FooB/1 :
      - 'name' changed from 'old' to 'new'
    

    它注册为值更改,而不是集合更改。我希望差异是这样的:

    Diff:
    * changes on com.FooA/#fooB/1 :
      - 'fooB' collection changes :
        . 'name' changed from 'old' to 'new'
    

    我做错了什么?

    0 回复  |  直到 6 年前
        1
  •  1
  •   ByeBye    6 年前

    使用 Javers 版本 5.2.4 :

    public class FooA {
        private List<FooB> fooB;
    
        public FooA(List<FooB> fooB) {
            this.fooB = fooB;
        }
    }
    
    public class FooB {
        private Integer id;
        private String name;
        private double num;
    
        public FooB(Integer id, String name, double num) {
            this.id = id;
            this.name = name;
            this.num = num;
        }
    }
    
    void test() {
        FooA old = new FooA(Arrays.asList(new FooB(1, "old", 1.0)));
        FooA new1 = new FooA(Arrays.asList(new FooB(1, "new", 1.0)));
    
        Javers javers = JaversBuilder.javers()
                .withListCompareAlgorithm(LEVENSHTEIN_DISTANCE)
                .build();
    
        System.out.println(
                javers.compare(old, new1)
        );
    }
    

    方法 test 返回:

    Diff:
    * changes on pl.javers.JaversTest$FooA/ :
      - 'fooB/0.name' changed from 'old' to 'new'
    

    这几乎和你想要的一样。

    FooA/fooB/0.name -&燃气轮机;fooA具有数组fooB,并且第一个(索引0)名称属性已更改