Javers возвращает неполный diff при изменении типа поля сущности (наследование) - PullRequest
1 голос
/ 13 июня 2019

Javers возвращает неполный diff, когда поле сущности объявлено с использованием абстрактного типа.

Я использую Javers 2.9.2, но также пробовал 5.4.0. Моя проблема появилась в обеих версиях.

У меня есть модель, подобная следующей:

// An entity.
class Entity {

  AbstractType field;
}

abstract class AbstractType {}

// A value object.
class ConcreteA extends AbstractType {

  AnotherEntity entityA;
}

// A value object.
class ConcreteB extends AbstractType {

  AnotherEntity entityB;

  // Other fields are omitted for simplicity.
}

// The class registered as an entity.
class AnotherEntity {

  String uuid;
  String name;
}

Я регистрирую сущности и объекты стоимости выше.

Сравнение следующих объектов:

AnotherEntity anotherEntity = new AnotherEntity("name");

Entity originalEntity = new Entity();
originalEntity.field = new ConcreteA(anotherEntity);

Entity updatedEntity = new Entity();
updatedEntity.field = new ConcreteB(anotherEntity);

javers.compare(originalEntity, updatedEntity);

Я ожидаю, что различие говорит:

  • Поле entityA удалено.
  • Добавлено поле entityB.

Но вместо этого diff говорит, что было удалено только поле entityA (ReferenceChange). Итак, в diff отсутствует одно поле.

Как я могу получить полную разницу для моего дела?

1 Ответ

1 голос
/ 17 июня 2019

В 5.5.0 мы добавили лучшую поддержку для рефакторинга типов. Добавленные / удаленные свойства обнаруживаются, и Javers рассчитывает для них правильный diff. Каждый PropertyChange имеет новый enum & mdash; PropertyChangeType указывает, добавлено ли свойство / удалено:

/**
 * When two objects being compared have different classes,
 * they can have different sets of properties.
 * <br/>
 * When both objects have the same class, all changes have PROPERTY_VALUE_CHANGED type.
 *
 * @since 5.5.0
 */
public enum PropertyChangeType {

    /**
     * When a property of the right object is absent in the left object.
     */
    PROPERTY_ADDED,

    /**
     * When a property of the left object is absent in the right object.
     */
    PROPERTY_REMOVED,

    /**
     * Regular value change &mdash; when a property is present in both objects.
     */
    PROPERTY_VALUE_CHANGED
}

PropertyChangeType также отражается в diff.prettyPrint():

Diff diff = javers.compare(originalEntity, updatedEntity)

println diff.prettyPrint()
Diff:
* changes on org.javers.core.cases.Entity/123 :
  - 'field.entityA' property with reference '...AnotherEntity/uuid' removed
  - 'field.entityB' property with reference '...AnotherEntity/uuid' added

...