Отслеживание измененных свойств в JPA
В настоящее время я работаю над проектом Java EE с некоторыми нетривиальными требованиями в отношении управления сохранением. Изменения в сущности пользователей сначала должны быть применены к какой-либо рабочей копии перед проверкой, после чего они применяются к "живым данным". Любые изменения в этих живых данных также должны иметь некоторую запись о них, чтобы разрешить аудит.
Объекты управляются через JPA, а Hibernate будет использоваться как поставщик. Это данность, поэтому мы не уклоняемся от вещей, связанных с гибернатом. Для первого требования используются две единицы персистентности. Один сопоставляет сущности с таблицами "живых данных", а другой - с таблицами "рабочая копия". Для второго требования мы собираемся использовать Hibernate Envers, подходящий для нашего прецедента.
Пока все хорошо. Теперь, когда пользователи просматривают данные на веб-интерфейсе, было бы очень полезно указать, какие поля были изменены в рабочей копии по сравнению с текущими данными. Другого цвета было бы достаточно. Для этого нам нужен способ узнать, какие свойства были изменены. Мой вопрос в том, что было бы хорошим способом сделать это?
Используя API JavaBeans, PropertyChangeListener
может быть достаточно, чтобы получать уведомления о любых изменениях в сущности рабочей копии и сохранять их набор. Но набор также необходимо будет сохранить, так как приложение можно перезапустить, а изменения могут быть долговечными, прежде чем они будут проверены и применены к текущим данным. И применение изменений в живых данных для получения рабочей копии каждый раз, когда это необходимо, не представляется возможным (отсюда и две единицы сохранения).
Мы могли бы также сравнить рабочую копию с текущими данными и найти поля, которые отличаются друг от друга. Некоторый код самоанализа и отражения будет достаточным, но опять же это кажется довольно интенсивным в обработке, не говоря уже о том, что нужно будет получить данные в реальном времени.
Возможно, я пропустил что-то простое, или кто-то знает замечательную функцию JPA/Hibernate, которую я могу использовать. Даже если я не могу избежать (a) отдельной таблицы (таблиц) базы данных для хранения такой информации до тех пор, пока она не будет применена к живым данным, некоторые полезные практики или реальный опыт с этим сценарием могут быть очень полезными.
Я понимаю, что это полуоткрытый вопрос, но, конечно же, другие люди, должно быть, столкнулись с таким требованием. Любое хорошее предложение оценивается, и любой указатель на готовое решение будет хорошим кандидатом в качестве принятого ответа.
Ответы
Ответ 1
Возможно, вы можете использовать прослушиватель событий сущности объекта Hibernate. Грязные свойства вычисляются до сброса. Вы можете хранить их где-то в своей базе данных.
A пример кода использования функции грязных свойств Hibernate, которая может дать вам идею.