Спящий режим: проверьте, какие поля объектов изменены

Что у меня:

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

Какой вызов:

В обработчике я должен проверить, какое поле объекта было изменено:

public void handle(Entity newVersion) {
  Session session = sessionFactory.openSession();
  Entity oldVersion = (Entity) session.get(Entity.class, entity.getId());
  List changedFields = compareChanges(oldVersion, newVersion);  //HOW TO CHECK WHICH FIELDS ARE CHANGED?
}

Я хочу сделать это по соображениям безопасности и уведомления. Средства:

  • Не все пользователи могут изменять все поля
  • Я должен уведомлять конкретных пользователей по определенным причинам при изменении некоторых полей.

Какая проблема:

Я получаю очень уродливый код. Фактически я повторяю все поля/коллекции и вызываю метод equals.

Вопрос:

Может быть, Hibernate предоставляет более элегантный способ проверить, какие поля были изменены? Как?

P.S.

@victorantunes предоставляет решение, но оно кажется слишком полным для меня. Может быть, некоторые альтернативы?

Ответы

Ответ 1

Что вы можете сделать, это сделать перехватчик Hibernate, который будет действовать как триггер в таких событиях, как создание, изменение и обновление. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html так что любая точка перед данным объектом должна быть изменена и сохранена, 1. Вы можете проверить, имеет ли пользователь доступ (вы можете получить имя пользователя из сеанса или базы данных), чтобы изменить конкретное поле, и, соответственно, вы можете предоставить доступ к сохранению или обновлению. 2. Вы можете уведомить другого пользователя только об изменении объекта.

Таким образом, вы можете создать новый перехватчик сеанса в spring реализации Hibernate 4 Session session = s.withOptions(). Перехватчик (новый YourInterceptor(). OpenSession();

Ответ 2

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

http://www.jboss.org/envers

Я начал использовать его для некоторого внутреннего аудита, и он очень прост и работает как шарм.

Вот быстрый учебник:

https://thenewcircle.com/s/post/115/easy_auditing_versioning_for_your_hibernate_entities_with_envers