Javers集合与父母的细节比较

时间:2017-03-08 02:08:02

标签: java diff javers

使用Javers 3.0.2, 我需要比较一个对象中嵌套字段的复杂对象集合,有时它甚至可以是另一个元素列表中的元素列表,依此类推。我正在使用Levenshtein列表比较,它要求列表的对象将字段定义为Id。我可以为所需对象定义Id字段,但这种方法的问题是我无法理解层次结构图中已更改对象的完整路径。理想情况下,我希望与实体具有相同的行为,但是Id的生成方式与ValueObjects相同。

所以,我试图描述的情况是

class A {
    @Id
    private String field0;
    private List<B> bList;
}
class B {
    @Id
    private String field1;
    private String field2;
    private List<C> cList;
}
class C {
    @Id
    private String field3;
    private String field4;
}

我需要比较A类的2个对象。我知道要使用Levensteing算法对集合进行充分的比较,我需要在B和C类上使用@Id注释。但是在这种情况下,我收到的变化例如像C @ field3#field4但是我不能说改变了C对象属于哪个B对象,所以我无法有效地构建更改对象的层次结构 A-&GT; bList [1] - &GT; CLIST [2]

对于ValueObjects,我有完整的更改路径,但是不可能将ValueObjects用作集合的元素。

2 个答案:

答案 0 :(得分:0)

您应该将A也映射为实体。给它一个ID。

答案 1 :(得分:0)

您可以从ValueObjectId.getFragment()

中提取路径
class A {
    @Id
    private String id;
    private List<B> bList;
}
class B {
    private String field1;
    private String field2;
    private List<C> cList;
}
class C {
    private String field3;
    private String field4;
}

def "should  "(){
  given:
  def a = new A(id:1, bList: [new B(cList: [new C(field3: 'a')])])
  def b = new A(id:1, bList: [new B(cList: [new C(field3: 'b')])])

  when:
  def javers = JaversBuilder.javers().build()
  def diff = javers.compare(a, b)
  println diff.prettyPrint()

  then:
  true
}

输出:

Diff:
1. ValueChange{globalId:'org.javers.core.cases.StackCase$A/1#bList/0/cList/0', property:'field3', oldVal:'a', newVal:'b'}