Java Javers系列与父级详细信息的比较

Java Javers系列与父级详细信息的比较,java,diff,javers,Java,Diff,Javers,使用Javers 3.0.2, 我需要比较对象中嵌套字段的复杂对象集合,有时它甚至可以是另一个元素列表中的元素列表,等等。我正在使用Levenshtein列表比较,它要求列表的对象将字段定义为Id。我可以为所需对象定义Id字段,但这种方法的问题是我无法理解层次图中更改对象的完整路径。因此,理想情况下,我希望具有与实体相同的行为,但以与ValueObject相同的方式生成Id 所以,我要描述的案例如下 class A { @Id private String field0;

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

所以,我要描述的案例如下

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类{
@身份证
私有字符串字段0;
私人名单;
}
B类{
@身份证
私有字符串字段1;
私有字符串字段2;
私有列表cList;
}
C类{
@身份证
私有字符串字段3;
私有字符串字段4;
}
我需要比较A类的两个对象。我知道要使用Levensteing算法对集合进行充分的比较,我需要对B类和C类进行@Id注释。然而,在这种情况下,我收到了更改,例如C@field3#字段4,但我不能说B对象更改了C对象属于哪个对象,所以我无法有效地构建更改对象的层次结构,如 A->bList[1]->cList[2]


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

您也应该将其映射为实体。给它一个Id。

您可以从
ValueObjectId.getFragment()


请澄清你的问题,举一些例子,所以,我改变了这个例子,但实际上结果是一样的-如果用户改变了cList字段(例如),在这种方法中,我无法从cList object->B->yes中找到路径,我最初尝试了这种方法。但是,在这种情况下,集合比较会生成太多的更改对象,如果它们的索引发生更改,则无法有效地比较集合的元素。这就是为什么我开始尝试使用Id和实体,所以我提出了这个问题
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'}