Я использую Hibernate Interceptor, и мне нужно перехватить также изменения коллекции - поэтому я переопределяю метод onCollectionUpdate ().
Проблема, с которой я столкнулся, связана с отложенной коллекцией типа List. Если у меня есть такой ленивый список в моей сущности, и этот список еще не инициализирован, и я добавляю в него какую-то новую сущность, перехватчик, кажется, работает неправильно - он вызывает метод onCollectionUpdate (Object collection, Serializable key), но когда я проверяю collection. getStoredSnapshot () возвращает новый уже обновленный список, а не предыдущую версию.
Когда я пытаюсь:
- изменить тип коллекции на Set -> он работает нормально
- делает коллекцию нетерпеливой -> она отлично работает
- инициализирует список перед тем, как добавить в него новую сущность -> она отлично работает
Это пример сущности и перехватчика:
@Entity
public class Page extends BaseEntity {
private List<Line> lines;
@OneToMany(mappedBy="page", cascade=CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval=true)
public List<Line> getLines() {
return lines;
}
public void setLines(List<Line> lines) {
this.lines = lines;
}
}
public class MyInterceptor extends EmptyInterceptor {
@Override
public void onCollectionUpdate(Object collection, Serializable key) {
Serializable storedSnapshot = ((AbstractPersistentCollection) collection).getStoredSnapshot();
...
}
}
Это тест:
public void testCollectionUpdate() {
Page page = pageService.loadPage(111L); // Page contains [Line("Line-1"), Line("Line-2")]
page.getLines().add(new Line("Test line"));
sessionFactory.getCurrentSession().flush(); // -> Now the onCollectionUpdate() is called
}
И проблема с тестом заключается в том, что перехваченная коллекция хранитSnaphost ArrayList, содержащий ["Line-1", "Line-2 "," Test line "], а сама коллекция представляет собой PersistentBag, содержащий [" Line-1 "," Line-2 ". «Тестовая строка»].
Так как получить предыдущее состояние сбора в таком случае? Это ошибка или я что-то не так делаю?
Спасибо!