Спящий режим: проверьте, какие поля объектов изменены
Что у меня:
У меня есть объект 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
Ответ 3
Я думаю, что перехватчики Hibernate могут использоваться http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html, вы можете сравнить старые и новые значения полей сущности.