Как эффективно сравнить два объекта одного класса и проверить, какие поля отличаются? - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу написать универсальную функцию, которая принимает два объекта одного и того же класса сущности и сравнивает разные поля и возвращает список всех изменений, внесенных в конкретные поля, за время.

Один из множестваклассы сущностей будут называться Member следующим образом

public class Member {
    String firstName;
    String lastName;
    String driverLicenseNumber;
    Integer age;
    LocalDateTime timestamp;
}

В БД у меня есть таблица member_audit, которая заполняется старыми данными всякий раз, когда происходит изменение в таблице-члене с использованием триггеров (аналогично для других сущностей).

Список ресурсов для каждой сущности, которую я бы возвращал, выглядит примерно так:

public class MemberAuditsResource {
    private String field;
    private LocalDateTime on;
    private String changeType;
    private String oldValue;
    private String newValue;
}

Я могу думать только о написании функции для каждой сущности в отдельности, как это

private List<MembeAuditsResource> memberCompare(Member obj1, Member obj2) {

    //Compare every field in both the objects using if else and populate the resource.

}

И затем вызывая вышеуказанную функцию для сравнения каждой пары записей в таблице entity_audit.Код будет очень большим для сравнения каждого поля и умножен на разные объекты.Есть ли лучший и эффективный способ?

Ответы [ 2 ]

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

Если вы расширяете идеи для сравнения графа объектов, это не тривиальная проблема.Таким образом, эффективный способ - не изобретать велосипед, а использовать существующую библиотеку, такую ​​как JaVers :

Member oldMember = new Member("foo" ,"chan" ,"AB12" , 21 ,LocalDateTime.now());
Member newMember = new Member("bar" ,"chan" ,"AB12" , 22 ,LocalDateTime.now());

Diff diff = javers.compare(oldMember, newMember);
for(Change change:  diff.getChanges()) {
    System.out.println(change);
}

Затем вы можете получить что-то вроде:

ValueChange{ 'firstName' changed from 'foo' to 'bar' }
ValueChange{ 'age' changed from '21' to '22' }
0 голосов
/ 23 февраля 2019

Преобразовать оба объекта в Map, используя метод JSON objectMapper.convertValue.Затем вы можете легко сравнить ключи / значения двух карт и создать список различий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...