Я не хочу сравнивать каждый атрибут с полем таблицы
Так что вам не нужен шаблон.
Тогда осталось 3 варианта.
Отражение
Используйте Java Отражение для итерации (нужна рекурсия, если ваша модель не плоская) через переменные-члены и сравнение. Когда у меня был этот вариант использования, я скопировал код из beancopy Spring и расширил его.
Использовать манипулирование байт-кодом
a. Runtime генерация байт-кода - используйте bytebuddy / cglib / asm, чтобы сгенерировать шаблон для вас, когда приложение запустится
b. Compiletime генерация байт-кода - Расширьте lombok, чтобы сгенерировать шаблон для вас, когда ваше приложение компилируется
Не используйте POJO, вместо этого используйте Map<String,Object>
Вы получите гибкость рефлексии, но, очевидно, вы потеряете здесь преимущество типизированного языка.
Есть еще один вариант, но он включает в себя перенос ответственности за генерацию событий из приложения. код для базы данных.
CD C (сбор данных изменений) Если вы используете базу данных, которая поддерживает распространение данных изменений, вы можете отделить свое приложение от этой ответственности.
Улов ,
Это асинхронная c операция
изменение Информация о данных зависит от выбранной вами базы данных. Старое значение может или не может быть там. Если старого значения нет, ему снова нужна другая стратегия, чтобы выяснить, что изменилось.