4.2.2.1. One-to-Many: один уровень вложенности

Рассмотрим реализацию композиции на примере сущностей Airport и Terminal:

composition recipe 1
  • Terminal.java - сущность Terminal содержит обязательную ссылку на Airport.

    В редакторе сущностей Studio установите следующие свойства для атрибута airport: Attribute type - ASSOCIATION, Cardinality - MANY_TO_ONE, Mandatory - on.

  • Airport.java - сущность Airport содержит one-to-many коллекцию терминалов. Соответствующее поле аннотировано @Composition для реализации композиции, и @OnDelete для каскадного мягкого удаления.

    В редакторе сущностей Studio установите следующие свойства для атрибута terminals: Attribute type - COMPOSITION, Cardinality - ONE_TO_MANY, On delete - CASCADE.

  • views.xml - представление airport-terminals экрана редактирования аэропорта содержит атрибут-коллекцию terminals. Для этого атрибута используется представление _local, так как атрибут airport сущности Terminal устанавливается только во время создания экземпляра Terminal и никогда не изменяется после этого, поэтому загружать его не требуется.

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

  • terminal-edit.xml - стандартный редактор для сущности Terminal.

В результате редактирование экземпляра аэропорта работает следующим образом:

  • В экране редактирования аэропорта отображается таблица терминалов.

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

  • Пользователь может создавать новые или удалять терминалы - все изменения сохраняются в источнике данных terminalsDs.

  • Пользователь нажимает OK в экране редактирования аэропорта, и измененный Airport вместе со всеми измененными экземплярами Terminal отправляется на middleware в метод DataManager.commit() и сохраняется в базе данных в рамках одной транзакции.