Javers извлекает добавленный объект в список - PullRequest
0 голосов
/ 14 февраля 2019

В javers возможно ли получить добавленный объект из списка (или любого Контейнера)?

Мне не нужен GlobalId, но реальный экземпляр объекта.

Похоже, getAddedValuesвернуть GlobalId вместо реального объекта.

Примечание: я не буду знать заранее, какой тип объекта я буду сравнивать.Это пример объекта.

MyTestObject obj1 = //Initialise it
MyTestObject obj2 = //Initialise it

Diff diff = javers.compare(obj1, obj2);

List<ContainerChange> containerChanges = diff.getChangesByType(ContainerChange.class);

for (ContainerChange containerChange : containerChanges) {
    for (Object addedValue : containerChange.getAddedValues()) {
        containerChange.getAffectedObject() //Returns the affected object
        addedValue //Returns an GlobalId but I want the real object added. (in this case the subObject added) Like the getAffectedObject() but with the other object.
    }
}

@TypeName("MyTestObject")
private static class MyTestObject {
    @Id
    private int id;
    private String value;
    private List<SubObject> subObjects;

    private MyTestObject() {

    }

    private MyTestObject(int id, String value, List<SubObject> subObjects) {
        this.id = id;
        this.value = value;
        this.subObjects = subObjects;
    }
}

@TypeName("SubObject")
private static class SubObject {
    @Id
    private int id;
    private String value;

    private SubObject() {

    }

    private SubObject(int id, String value) {
        this.id = id;
        this.value = value;
    }
}

1 Ответ

0 голосов
/ 16 февраля 2019

Я нашел решение с каким-то другим changeType.Мне удалось построить карту с помощью getChangesByType для NewObject и ObjectRemoved.Объект присутствует в затронутом объекте в этих изменениях.

Примерно так:

     map = Stream.of(NewObject.class, ObjectRemoved.class)
                .flatMap(type -> diff.getChangesByType(type).stream())
                .collect(
                        Collectors.toMap(change -> change.getAffectedGlobalId().toString(), 
                                         change -> change.getAffectedObject().get()));

И получить объект с помощью addValue

addedAndRemovedObjects.get(containerChange.getAddedValues().get(1).toString());

Примечание 1:Я, вероятно, изменил бы ключ toString для чего-то другого, но это работало для моего тестового примера.Существовали GlobalId и IdentityId, которые не были равны, но toString был.

Примечание 2: getAddedValues ​​(). Get (1) только для примера.

...