В Hibernate Envers новая версия объекта должна создаваться только в том случае, если изменяется свойство, отличное от, например, «name».
public class Customer {
private String name;
private Adress adress;
}
Для этого я создал слушателя следующим образом.
public class MyAuditListener extends EnversPostUpdateEventListenerImpl {
public MyAuditListener(EnversService enversService) {
super(enversService);
}
@Override
public void onPostUpdate(PostUpdateEvent event) {
if (!Customer.class.isInstance(event.getEntity())) {
return false;
}
int[] indicesDirtyProperties = event.getDirtyProperties();
int[] propertyIndices = event.getPersister().getEntityMetamodel().getPropertyIndex(property)
int[] indicesRemainingProperties = removeAll propertyIndices from indicesDirtyProperties
if (indicesRemainingProperties.length > 0) {
super.onPostUpdate(event);
}
}
}
Код работает, но только частично отвечает требованиям: я хотел бы один раз определить в событии для класса Customer, есть ли какие-либо изменения в дереве объектов, кроме свойства "name" - и если так, то версия всего дерева объектов
Проблемы, с которыми я сталкиваюсь, состоят в том, что для каждого класса новое событие приходит с dirtyProperties, заполненным только для этого соответствующего класса. Таким образом, для обновления отправляются два события: 1-е событие для класса Customer с dirtyProperties только в этом классе, а затем 2-е событие для класса Adress для dirtyProperties только в этом классе. Кроме того, super.onPostUpdate(event)
создает только новую версию для этого класса, а не целое дерево объектов.
Является ли вышеуказанный подход к слушателю совершенно неверным? Что мне нужно сделать?
Обновление:
Отображение выглядит следующим образом. Причина: Адрес также отображается в другом классе. Там он отображается таким же образом, но с другой таблицей сопоставления. Оба отображения являются однонаправленными.
public class Customer {
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "T_CUST_ADD",
joinColumns = {@JoinColumn(name = "CUST_ID", referencedColumnName = "ID")},
inverseJoinColumns = {@JoinColumn(name = "ADDR_ID", referencedColumnName = "ID")})
private Address address;
}
public class Address {
}