OnCollectionUpdate () перехватчика гибернации с отложенным списком - неправильный сохраненный снимок - PullRequest
0 голосов
/ 14 октября 2019

Я использую 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 ". «Тестовая строка»].

Так как получить предыдущее состояние сбора в таком случае? Это ошибка или я что-то не так делаю?

Спасибо!

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