JaVersを使用してJavaオブジェクトの変更を追跡したいと考えています。基本的な例はうまくいきますが、コレクションに格納されているオブジェクトの変更を検出することはできません。JaVersがコレクション内のオブジェクト属性の変更を検出しない
例を変更してChangeLogExample.classの例を拡張すると、サブ縦1:
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インスタンスに変更を個別にコミットするときに訓練生の年齢に変更を加えますが、それは私が期待していたものではなく、私が望むものでもありません。
私の質問は、どのように変更履歴に表示される年齢の変更を取得するのですか? https://github.com/javers/javers/tree/master/javers-core/src/test/java/org/javers/core/examples/modelが
シャドウオブジェクトは非常に有望に見えます。すべての "依存する"クラスに '@ ValueObject'を付けるだけで十分ですか?自分自身のテストクラスでは、これは十分だと思われますが、「欠落している親を追加する:2.0 - > ...」のようなログメッセージが表示されますが、それは問題ですか? –
はい、依存オブジェクトを@ValueObjectとしてマッピングするとジョブが実行されます。このログメッセージは騒々しいデバッグメッセージです。それについて心配しないでください。次のリリースで削除する必要があります。そのことを報告してくれてありがとう –