2017-03-08 78 views
-1

使用Javers 3.0.2, 我需要比较对象中嵌套字段的复杂对象的集合,有时它甚至可以是另一个元素列表中的元素列表等等。我正在使用Levenshtein列表比较,并且它要求列表的对象将字段定义为Id。我可以为所需对象定义Id字段,但这种方法的问题是我无法理解层次结构图中已更改对象的完整路径。所以理想情况下,我希望具有与实体相同的行为,但要使Id与ValueObjects的生成方式相同。 任何想法如何解决这一问题的高度赞赏Javers收集比较关于父母的详细信息

+0

请澄清你的问题,把一些例如 –

回答

0

所以,我试图来形容情况下

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那样的变化,但我不能说改变了哪个B对象所属的C对象,所以我不能有效地建立更改对象的层次结构,如 A-> bList [1] - > cList [ 2]

在ValueObjects的情况下,我有变化的完整路径,但它不可能使用ValueObjects作为收藏

0

的元素,您应该A也映射为实体。给它一个ID。

+0

所以,我已经改变了这个例子,但实际上结果是相同的 - 如果用户更改cList字段(例如),在这种方法中,我无法从cList对象找到路径 - > B - > A – Denis

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'} 
+0

是的,我最初尝试了这种方法。但是,在这种情况下,收集比较会生成太多的Change对象,如果其索引已更改,则无法有效比较收集的元素。所以这就是为什么我开始尝试使用Id和实体的原因,所以我提出了这个问题 – Denis