Пропадают несохраненные изменения в dataContext при переходе между страницами пагинации

Добрый день!

Контекст:
У меня есть экран редактирования (detailView). Помимо обычных полей, на нем есть dataGrid, некоторые колонки которого используют ComponentRenderer для отображения компонентов (CheckBox, EntityComboBox и т.д.).

Известное поведение (и моя попытка решения):
Как мы знаем, при изменении значения в компоненте (например, CheckBox) и переходе на другую страницу пагинации, при возврате обратно значения сбрасываются к исходным из БД. Это происходит потому, что при навигации по страницам срабатывает DataLoader, который перезаписывает DataContainer данными из БД, и ComponentRenderer заново создает компоненты с этими “свежими” значениями.

В Jmix 1.x для решения этой проблемы мы использовали такой подход: перед созданием компонента сначала проверяли наличие измененной сущности в DataContext с помощью dataContext.find(). Это позволяло отображать несохраненные правки пользователя, что было очень удобно — не требовалось постоянно сохранять каждое изменение в таблице; все накопленные правки фиксировались разово по нажатию кнопки “ОК”.

Проблема в Jmix 2.4:
Я обнаружил, что в Jmix 2.4 изменения тоже попадают в DataContext, но они теряются при возврате на предыдущую страницу пагинации.

Пример и наблюдения:
Для начала захожу в раздел users тестового проекта, выбираю пользователя admin и нажимаю редактировать.

  1. Нахожусь на странице 1 dataGrid, изменяю значение CheckBox с false на true.
  2. Перехожу на страницу 2. Через Debug вижу, что DataContext содержит измененную сущность со значением true.
  3. Возвращаюсь на страницу 1. Перед генерацией ComponentRenderer снова проверяю DataContext — значение свойства сущности в нем изменилось обратно на false.
  4. Пытался отследить это через DataContext.ChangeEvent, но он не фиксирует никаких изменений DataContext в момент возврата на страницу.

Ключевой вопрос:
Почему состояние DataContext меняется при навигации по страницам DataGrid? Куда и почему пропадают несохраненные изменения из контекста? Это поведение отличается от Jmix 1.x, и я не могу найти причину.

Прикладываю тестовый проект для проверки - GitHub - ShafirSharifullin/test-project

Добрый день, Артём!

В пункте 3, когда возращаемся на страницу с изменённой таской, из базы заново загружаются сущности со “старым” состоянием. После загруки они вливаются в DataContext, а т.к. изменённая сущность уже есть в контексте, то он берёт состояние сущности из базы данных и проставляет его в изменённую. Поэтому значение completed возращается в false.

Такое же поведение я наблюдаю и в версии 1.7.1. Можете подсказать в какой версии было другое поведение?

Здравствуйте!
На версии 1.3.0

В версии 1.3.0 значение также перезаписывается. Возможно в вашем проекте были доработки для сохранения состояния?

Хмм, а какие рекомендации можете дать по поводу моего решения?
Может стоит не вливать в dataContext данные после загрузки из бд или тут есть риски потери данных или поломки?

Все загруженные помещать не нужно. Можно попробовать добавлять в DataContext только изменённые сущности, а при рендеринге смотреть, есть ли эта сущность в DataContext и брать значение из контекста.

Доработал немного пример: test-project.zip (1.0 МБ)