Javers сравнивая списки в списках - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблемы со сравнением списков в списках. Свойства моих внутренних списков не сравниваются, как я ожидал. Вместо этого объекты с одинаковым идентификатором перечислены как удаленные и добавленные.

Javers javers = JaversBuilder.javers()
                .withListCompareAlgorithm(AS_SET)
                .registerEntity(Rent.class)
                .registerValue(Book.class)
                .build();

List<Book> bookListOld = new ArrayList<>(Arrays.asList(
    new Book("book1", "like new", "Chronicles of..."),
    new Book("book2", "like new", "Data vs. Goliath")
));

List<Book> bookListNew = new ArrayList<>(Arrays.asList(
    new Book("book1", "broken", "Chronicles of...")
));

List<Rent> lstRentOld = new ArrayList<>(Arrays.asList(
    new Rent("Smith", bookListOld)
));

List<Rent> lstRentNew = new ArrayList<>(Arrays.asList(
    new Rent("Smith", bookListNew)
));

Diff difference = javers.compareCollections(lstRentOld, lstRentNew, Rent.class);

Объекты:

@AllArgsConstructor @Data @ToString
@TypeName("Rent")
public class Rent {
    @Id
    private String collectionIdentifier;  // Person identifier which rented a list of books
    private List<Book> books;
}

@AllArgsConstructor @Data @ToString
@TypeName("Book")
public class Book {
    @Id
    private String identifier;
    private String condition;
    private String title;
}

Git пример репо выпуска: Git

Результат этой настройки:

Diff:
* changes on compare.model.Rent/Smith :
  - 'books' collection changes :
    . 'Book(identifier=book2, condition=like new, title=David vs. Goliath)' removed
    . 'Book(identifier=book1, condition=like new, title=Chronicles of...)' removed     //shoulde in change
    . 'Book(identifier=book1, condition=broken, title=Chronicles of...)' added         //shoulde in change

Я не могу разобрать мою ошибку. Результат правильно содержит удаленный book2, но изменение свойства book1.condition не распознается. Несмотря на то, что идентификаторы eqal.

Я ожидал бы что-то вроде этого:

Diff:
* changes on compare.model.Rent/Smith :
  - 'books' collection changes :
    . 'Book(identifier=book2, condition=like new, title=David vs. Goliath)' removed
    * changes on Book/book1 :
    - 'condition' value changed from 'like new' to 'broken'

Если я удалю registerEntity / -Value в конструкторе объектов javers. Изменение значения правильно определено, но у меня нет возможности связать эту информацию с Объектом Аренды «Смит». Ну, в этом простом примере я могу, но нет, если в списках больше записей.

Итак, вопросы:

Почему не распознается разница book1? Возможно ли это вообще?

Как я могу убедиться, что могу связать изменение с объектом Rent с идентификатором «Smith»?

...