Ответ 1
Отличный вопрос, это короткий ответ: Hibernate-Session имеет метод isDirty()
Длинный ответ с примером (ТЕСТИРОВАНИЕ CASE 1):
Если вы используете Seam/POJOs/JPA поверх Hibernate. вы хотели бы знать, какие сущности грязны перед вызовом entityManager.flush() - то есть знать, для каких объектов Hibernate будет выдавать инструкцию update - и применять некоторые изменения в этих записях (установить некоторые значения, например, кто изменил запись и т.д.),.
вы знаете, что в Hibernate-Session есть метод isDirty(), но в некоторых случаях этого недостаточно.
вы можете зарегистрировать Hibernate-Interceptor в файле persistence.xml
<property name="hibernate.ejb.interceptor" value="path.to.MyInterceptor" />
и перехватите метод onFlushDirty (...) и сохраните грязные объекты на карте, но как я могу получить доступ к этой карте позже? У меня нет доступа к перехватчику во время выполнения (чтобы я мог вызвать interceptor.getDirtyEntities()), у вас есть это:
public class MyInterceptor extends EmptyInterceptor {
private Map<IdentityKey,Object> dirtyEntitiesMap = new HashMap<IdentityKey,Object>();
@Override
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
dirtyEntitiesMap.put(new IdentityKey(id, entity.getClass()), entity);
return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);
}
...
}
SOLVER ЭТОТ ИСПЫТАТЕЛЬНЫЙ СЛУЧАЙ: Вам не нужно знать, какие объекты меняются, если вам нужно их обновить. Вы можете добавить свой код (заполнив пользователя, который их изменил) в методе @PreUpdate. Объекты, которые являются грязными, будут соответствующим образом изменены, те, которые не являются, не получат этот метод, потому что ничего не обновлять (и Hibernate обнаружит это). Вы можете сделать то же самое для новых объектов в методе @PrePersist, который, вероятно, идентичен. Вы можете аннотировать тот же метод с обоими.
Если вам также необходимо записать, какие поля были изменены, я бы предложил сначала посмотреть на Envers.