2017-06-06 105 views
0

我想使用JaVers來跟蹤我的Java對象的更改。基本的例子工作正常,但我無法檢測到存儲在集合中的對象的更改。JaVers未檢測到集合中對象屬性的更改

如果我擴展ChangeLogExample.class示例以更改例如子座標之一:

public static void main(String[] args) { 

    Javers javers = JaversBuilder.javers().build(); 
    Employee bob = new Employee("Bob", 9_000, "Scrum master"); 
    javers.commit("hr.manager", bob); 

    // do some changes and commit 
    bob.setPosition("Team Lead"); 
    bob.setSalary(11_000); 
    javers.commit("hr.director", bob); 

    bob.addSubordinates(new Employee("Trainee One"), new Employee("Trainee Two")); 
    javers.commit("hr.manager", bob); 

    bob.getSubordinates().get(0).setAge(42); // <<<< This is the change I want to detect 
    javers.commit("hr.manager", bob); 

    // when: 
    List<Change> changes = javers.findChanges(
     QueryBuilder.byInstanceId("Bob", Employee.class).withChildValueObjects().build()); 
    String changeLog = javers.processChangeList(changes, new SimpleTextChangeLog()); 

    // then: 
    System.out.println(changeLog); 
} 

這是印在更新日誌:

commit 3.0, author: hr.manager, 2017-06-06 11:17:17 
    changed object: Employee/Bob 
    list changed on 'subordinates' property: [(0).added:'Employee/Trainee One', (1).added:'Employee/Trainee Two'] 
commit 2.0, author: hr.director, 2017-06-06 11:17:17 
    changed object: Employee/Bob 
    value changed on 'position' property: 'Scrum master' -> 'Team Lead' 
    value changed on 'salary' property: '9000' -> '11000' 

所以換到第一下屬的年齡不會在更新日誌顯示。使用withChildValueObjects()不會產生影響。

當我將更改單獨提交給Employee實例時,我得到了實習生年齡的變化,但這不是我想要的(也不是我想要的)。

所以我的問題是:如何讓更改顯示在ChangeLog中?


我使用JaVers 3.2.0

Employee類是從JaVers例子不變:https://github.com/javers/javers/tree/master/javers-core/src/test/java/org/javers/core/examples/model

main()方法是簡單地從https://github.com/javers/javers/blob/master/javers-core/src/test/java/org/javers/core/examples/ChangeLogExample.java

回答

0

好,幾個測試問題在這裏。 首先,Empolyee對象映射爲Entities。所以在JaVers中,他們之間沒有父母/子女關係(實際上是任何種類的關係)。 這就是爲什麼withChildValueObjects()過濾器不適用於此。 它只適用於ValueObjects擁有Entities,請參閱http://javers.org/documentation/jql-examples/#child-value-objects-filter

儘管如此,有兩種方法可以改善您的查詢。

  1. 直接詢問您要跟蹤的實體實例。

  2. 在查詢範圍中使用新的Shadow API,請參見http://javers.org/documentation/jql-examples/#query-for-shadows 這是一項新功能,將在功能上得到改進。 如果查詢選擇了兩個實體的快照,則可以使用它。

見下面的代碼:

def "should ... "(){ 
    given: 
    Javers javers = JaversBuilder.javers().build() 
    Employee bob = new Employee("Bob", 9_000, "Scrum master") 
    javers.commit("hr.manager", bob) 

    // do some changes and commit 
    bob.setPosition("Team Lead") 
    bob.setSalary(11_000) 
    javers.commit("hr.director", bob) 

    bob.addSubordinates(new Employee("Trainee One"), new Employee("Trainee Two")) 
    javers.commit("hr.manager", bob) 

    bob.getSubordinates().get(0).setAge(42) // <<<< This is the change I want to detect 
    bob.salary++ // ! 
    javers.commit("hr.manager", bob) 

    when: "ask for the the right Entity instance" 
    List changes = javers.findChanges(
      QueryBuilder.byInstanceId("Trainee One", Employee.class).build()) 

    then: 
    println(javers.processChangeList(changes, new SimpleTextChangeLog())) 
    true 

    when: "use the new Shadows" 
    List shadows = javers.findShadows(
      QueryBuilder.byInstanceId("Bob", Employee.class) 
         .withShadowScopeDeep().build()) 

    then: 
    shadows.each { 
     assert it.get() instanceof Employee 
    } 
    Employee lastBobShadow = shadows[0].get() 
    assert shadows[0].commitMetadata.id.majorId == 4 
    assert lastBobShadow.subordinates[0].name == "Trainee One" 
    assert lastBobShadow.subordinates[0].age == 42 
} 
+0

陰影物體看起來很有希望。用@ ValueObject來註釋所有的「依賴」類是否足夠了?有了我自己的測試類,這似乎就足夠了,儘管我確實收到了一些日誌消息,比如「添加缺少的父項:2.0 - > ...」 - 是一個問題嗎? –

+0

是的,映射相關對象作爲@ValueObject應該做的工作。此日誌消息只是一個嘈雜的調試消息。別擔心。它應該在下一個版本中刪除。 thanx報告 –

相關問題