Hibernate Envers: отслеживание изменений в стороне-владельце отношения OneToMany

У меня есть две проверенные сущности, A и B. Субъект A содержит коллекцию сущностей B (аннотированных как отношение «один ко многим») При вставке нового экземпляра A в базу данных все строки A и B имеют одну и ту же ревизию (скажем, ревизия 1). Затем происходит обновление A, которое влияет только на экземпляры объекта B (каскадный тип - слияние). Таким образом, после обновления сущность A все еще находится в редакции 1, тогда как сущности B находятся в редакции 2 (новая запись MOD в таблице аудита).

Проблема в том, что когда я получаю все ревизии A, я ожидаю получить 2 ревизии взамен: одну для создания, одну для модификации собственной коллекции B. Я могу получить такое поведение в случае ManyToMany, но не могу заставить его работать таким же образом с отношением OneToMany.

(Я использую Hibernate 3.6.10-Final)

 Jean28 июн. 2012 г., 11:22

Ответы на вопрос(1)

Я решил свою проблему, добавив скрытое поле даты lastUpdated в мой эквивалент вашей сущности A.

@Entity
public class A {
    private Date lastModified;
    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL )
    private List<B> blist;
    public void touch(){
        lastModified=new Date();
    }
}

В связанных сущностях (как вы B поле), я добавил следующее:

public class B {
    @ManyToOne
    private A a; 

    @PreUpdate
    public void ensureParentUpdated(){
        if(a!=null){
            a.touch();
        }
    }
}

Это гарантирует, что ревизия добавляется в A при каждом добавлении ревизии в B.

Ваш ответ на вопрос