Может ли Javers сравнить два набора, содержащих valueObject, идентифицируя их с помощью методов equals / hashcode, чтобы обнаружить изменения? - PullRequest
0 голосов
/ 19 июня 2019

Может ли Javers сравнить два набора, чтобы определить изменения, произошедшие в объектах в новом наборе для каждого соответствующего объекта в старом наборе?

Использует ли реализация метод equals класса объекта значения? Я реализовал метод equals для моего объекта-значения, но он все равно, похоже, рассматривает их как разные объекты. Если он не использует метод equals, мы можем сделать это? Потому что сам Java Set использует метод equals, чтобы убедиться, что в наборе нет дубликатов.

Пожалуйста, предложите.

В приведенном ниже тесте я использую sysCode и localId в качестве комбинированного идентификатора для объекта, не считая goldenId. Но diff (вывод ниже класса) не распознает эти равные объекты и показывает diff как все объекты в старом наборе как удаленные и объекты в новом se как добавленные, что, кажется, не добавляет никакого значения.

Вот мой тестовый пример:

Javers javers = JaversBuilder.javers().build();
SetConMap oldMap = new SetConMap();
Set<Contact> oldSysCons = new HashSet<>();
oldMap.setSysCons(oldSysCons);
oldSysCons.add(new Contact().sysCode("AL").localId("123").goldenId("ABC"));
oldSysCons.add(new Contact().sysCode("AL").localId("456").goldenId("ABC"));

SetConMap newMap = new SetConMap();
Set<Contact> newSysCons = new HashSet<>();
newMap.setSysCons(newSysCons);
newSysCons.add(new Contact().sysCode("AL").localId("123").goldenId("DEF"));
newSysCons.add(new Contact().sysCode("AL").localId("456").goldenId("DEF"));
newSysCons.add(new Contact().sysCode("AL").localId("789").goldenId("DEF"));

Diff diff = javers.compare(oldMap, newMap);
System.out.println(diff);
private static class Contact {
    private String sysCode;
    private String localId;
    private String goldenId;
//getters, setters.
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return obj != null && (obj instanceof Contact) && Objects.equals(sysCode, ((Contact) obj).getSysCode())
            && Objects.equals(localId, ((Contact) obj).getLocalId());
    }
}

Diff:

* new object: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/c76fadcd55d4dbf6d8cbe49310b1ab26
* new object: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/96b23b34a0f42a5105491350db5c46f1
* new object: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a9c7f46bbe5f0e46b5751f3f5c5d8542
* object removed: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a53e4ba1b22c4f290a80daf40adf5d81
* object removed: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/782edf187b8add9bab004ca06f7b6c7c
* changes on org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/ :
  - 'sysCons' collection changes :
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/782edf187b8add9bab004ca06f7b6c7c' removed
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a53e4ba1b22c4f290a80daf40adf5d81' removed
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a9c7f46bbe5f0e46b5751f3f5c5d8542' added
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/c76fadcd55d4dbf6d8cbe49310b1ab26' added
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/96b23b34a0f42a5105491350db5c46f1' added

1 Ответ

0 голосов
/ 19 июня 2019

Класс Contact рассматривается Javers как объект значения: в этом случае он выполняет сравнение свойств по свойствам (см. здесь ).

Чтобы получить более подробные результаты сравнения, вы можете преобразовать класс Contact в сущность, используя аннотацию @Id для одного из его свойств.

Другим решением может быть написание собственного компаратора здесь (но я никогда не пробовал).

...