4.2.2.3. One-to-Many: три уровня вложенности
Представьте, что вам необходима еще одна сущность, содержащая некоторые детали места встречи (MeetingPoint
). Назовем эту сущность Note. Таким образом, вся структура будет выглядеть следующим образом: Airport > Terminal > Meeting Point > Note.
CUBA может обеспечить работу с композициями с максимум двумя уровнями вложенности. Теперь у нас структура с тремя уровнями, поэтому необходимо ограничить глубину композиции либо сверху, либо снизу. В данном разделе мы рассмотрим два различных (с точки зрения user experience) подхода для исключения из композиции аэропорта. Оба подхода решают одну и ту же проблему: так как теперь терминалы сохраняются в базу данных независимо от аэропорта, невозможно сохранить терминал для только что созданного аэропорта, пока он не сохранен в БД.
-
При первом подходе браузер и редактор аэропорта выглядят так же, как и раньше, но редактор имеет дополнительную кнопку Save для сохранения нового аэропорта не закрывая экрана. Пользователь не может создавать терминалы, пока новый аэропорт не сохранен.
-
airport-edit.xml содержит standalone источник данных для терминалов вместо вложенного. Этот источник связан с источником аэропорта, и поэтому загружает терминалы только для редактируемого аэропорта. Кроме того, экран содержит фрейм
extendedEditWindowActions
, позволяющий пользователю сохранить аэропорт не закрывая экран. -
AirportEdit.java - здесь, в методе
postInit()
редактора аэропорта, мы управляем состоянием enabled действия создания терминала и передаем текущий экземпляр аэропорта для инициализации ссылки в создаваемом терминале.
-
-
При втором подходе мы разбиваем браузер аэропортов на две панели: одна для списка аэропортов, вторая для зависимого списка терминалов. Т.е. список терминалов теперь находится вне редактора аэропорта. Действие создания терминалов недоступно, если не выбран ни один аэропорт.
-
airport-browse.xml содержит standalone источник данных для списка терминалов. Он связан с источником аэропортов, и загружает терминалы только для выбранного аэропорта.
-
AirportBrowse.java - здесь, в методе
init()
браузера аэропорта, мы управляем состоянием enabled действия создания терминала и передаем выбранный экземпляр аэропорта для инициализации ссылки в создаваемом терминале.
-