2

使用 Javers 3.0.2,我需要比较作为对象中嵌套字段的复杂对象的集合,有时它甚至可以是另一个元素列表中的元素列表,依此类推。我正在使用 Levenshtein 列表比较,它要求列表的对象具有定义为 Id 的字段。我可以为所需对象定义 Id 字段,但这种方法的问题是我无法理解层次图中更改对象的完整路径。因此,理想情况下,我希望具有与实体相同的行为,但要以与 ValueObjects 相同的方式生成 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 类的 2 个对象。我知道要使用 Levensteing 算法对集合进行充分比较,我需要在 B 和 C 类上添加 @Id 注释。但是在这种情况下,我收到了更改,例如 C@field3#field4 但我不能说更改的 C 对象属于哪个 B 对象,因此我无法有效地构建更改对象的层次结构,例如 A->bList[1]->cList[2 ]

在 ValueObjects 的情况下,我有完整的更改路径,但不可能将 ValueObjects 用作集合的元素。

4

2 回答 2

1

您可以从中提取路径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'}
于 2017-03-15T19:52:24.923 回答
0

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

于 2017-03-13T18:42:05.847 回答