Hibernate включает версию дерева объектов только в некоторых случаях - PullRequest
0 голосов
/ 04 февраля 2020

В 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 {

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...