4.2.2.3. One-to-Many: три уровня вложенности

Представьте, что вам необходима еще одна сущность, содержащая некоторые детали места встречи (MeetingPoint). Назовем эту сущность Note. Таким образом, вся структура будет выглядеть следующим образом: Airport > Terminal > Meeting Point > Note.

composition recipe 4

CUBA может обеспечить работу с композициями с максимум двумя уровнями вложенности. Теперь у нас структура с тремя уровнями, поэтому необходимо ограничить глубину композиции либо сверху, либо снизу. В данном разделе мы рассмотрим два различных (с точки зрения user experience) подхода для исключения из композиции аэропорта. Оба подхода решают одну и ту же проблему: так как теперь терминалы сохраняются в базу данных независимо от аэропорта, невозможно сохранить терминал для только что созданного аэропорта, пока он не сохранен в БД.

  • При первом подходе браузер и редактор аэропорта выглядят так же, как и раньше, но редактор имеет дополнительную кнопку Save для сохранения нового аэропорта не закрывая экрана. Пользователь не может создавать терминалы, пока новый аэропорт не сохранен.

    • airport-edit.xml содержит standalone источник данных для терминалов вместо вложенного. Этот источник связан с источником аэропорта, и поэтому загружает терминалы только для редактируемого аэропорта. Кроме того, экран содержит фрейм extendedEditWindowActions, позволяющий пользователю сохранить аэропорт не закрывая экран.

    • AirportEdit.java - здесь, в методе postInit() редактора аэропорта, мы управляем состоянием enabled действия создания терминала и передаем текущий экземпляр аэропорта для инициализации ссылки в создаваемом терминале.

  • При втором подходе мы разбиваем браузер аэропортов на две панели: одна для списка аэропортов, вторая для зависимого списка терминалов. Т.е. список терминалов теперь находится вне редактора аэропорта. Действие создания терминалов недоступно, если не выбран ни один аэропорт.

    • airport-browse.xml содержит standalone источник данных для списка терминалов. Он связан с источником аэропортов, и загружает терминалы только для выбранного аэропорта.

    • AirportBrowse.java - здесь, в методе init() браузера аэропорта, мы управляем состоянием enabled действия создания терминала и передаем выбранный экземпляр аэропорта для инициализации ссылки в создаваемом терминале.