#java #hibernate
#java #гибернация
Вопрос:
Для веб-приложения Java (Struts / Spring / Hibernate) прослушиватели событий гибернации являются новой функцией для ведения журнала аудита.
Когда возникает необходимость получить некоторую дополнительную информацию, такую как пользователь, который обновил объект, сведения о том, какие атрибуты объекта изменились по сравнению с атрибутами объекта предварительного просмотра и т.д., Существуют ли шаблоны наилучшей практики, которым можно следовать?
Пример: Для информации, связанной с пользователем, если каждый объект поддерживает атрибуты журнала изменений (UpdatedBy, CreatedBy), тогда сам объект может предоставить информацию.
Для сравнения того, какие атрибуты объекта изменились по сравнению с предыдущим состоянием объекта в DB, нет ли другого способа, кроме сравнения всех атрибутов объектов перед вставкой? (Это кажется избыточной мерой)
Ответ №1:
Если вам это нужно специально для аудита, нет необходимости изобретать велосипед — взгляните на JBoss Envers
Ответ №2:
В справочной документации по гибернации предоставляется AuditInterceptor в качестве примера реализации перехватчика гибернации.
Вы можете расширить EmptyInterceptor и переопределить метод boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types)
, который имеет ссылку на текущий объект и его идентификатор, содержимое его полей в текущем и предыдущем состоянии и все имена полей и типы.
С приложением на базе Spring вы можете настроить эти перехватчики в контексте вашего приложения Spring, где вы настраиваете Hibernate SessionFactory.