Добрый день!
Столкнулся с проблемой разрыва связей ManyToMany
между сущностями.
Описание системы:
jmix 1.4.4
В системе есть сущности: А, Б, В.
Связи между ними:
-
А
—OneToMany
→Б
-
А
—ManyToMany
—Б
-
А
—ManyToMany
—В
-
Б
—ManyToMany
—В
Для каждого класса существуют связанные экраны редактирования. На формах есть возможность открывать связанные элементы, при этом передаётся родительский контекст.
Воспроизведение проблемы:
Пользователь выполняет следующую последовательность действий:
- Открывает форму редактирования для А.
- На форме А открывает на редактирование сущность Б.
- На форме Б связывает сущность В.
- Завершает работу с формой — коммит в родительский контекст с сохранением данных.
- Открывает формы: А → Б → В.
- На форме В изменяет одно из полей (например, текстовое поле
name
). - Последовательно закрывает формы с сохранением данных.
- Открывает формы А → Б — на форме Б в таблице отсутствует ранее добавленная связь с В.
Результат: Изменение В привело к утрате связи с Б.
Анализ проблемы:
При отладке выяснилось, что при открытии формы В не загружается множественная связь, она явно не указана в плане загрузки экрана, но при обработке запроса попадает в FetchGroup поэтому подвергается обработке в стандартном режиме (загрузка и установка значения). Связь теряется при вложенности более 3 экранов, но при просмотре в режиме отладки значение устанавливается.
Примечание: Если открыть экраны Б → В напрямую — всё работает корректно, значение связи подтягивается, разрыв не осуществляется.
Аналогичное поведение наблюдается во всей системе при подобном порядке взаимодействия сущностей.
Решение:
Решил проблему явным указанием множественных связей в плане загрузки перед загрузкой данных на экран.
Вопрос:
Сталкивался ли кто-то с подобным поведением? Есть ли рекомендации по работе с такими сценариями?