5.8.3.2. Глубокая композиция
Композиция может быть более глубокой, то есть состоять из нескольких уровней вложенности. Усложним приведенный выше пример, добавив сущность MeetingPoint, описывающую место встречи у терминала аэропорта:
Теперь сущность Terminal содержит атрибут meetingPoints - коллекцию экземпляров MeetingPoint. Для того, чтобы все три сущности представляли собой единую композицию и редактировались совместно, нужно в дополнение к описанному в предыдущем разделе выполнить следующее:
-
Атрибуту
meetingPointsклассаTerminalдобавить аннотации@Compositionи@OnDeleteаналогично атрибутуterminalsклассаAirport. -
Создать новое представление для
Terminal:<view entity="sample$Terminal" name="terminal-edit" extends="_local"> <property name="meetingPoints" view="_local"/> </view>И использовать его в представлении
Airportвместо_local:<view entity="sample$Airport" name="airport-edit" extends="_local"> <property name="terminals" view="terminal-edit"/> </view> -
В XML-дескрипторе экрана редактирования аэропорта определить источники данных для экземпляра
Airportи вложенных сущностей на всю глубину композиции:<dsContext> <datasource id="airportDs" class="com.haulmont.sample.entity.Airport" view="airport-edit"> <collectionDatasource id="terminalsDs" property="terminals"> <collectionDatasource id="meetingPointsDs" property="meetingPoints"/> </collectionDatasource> </datasource> </dsContext>Здесь источник данных
meetingPointsDsне связан ни с какими визуальными компонентами, однако он необходим для корректной работы совместного редактирования композиции. -
В XML-дескрипторе экрана редактирования терминала в свою очередь определить для коллекции
meetingPointsвложенный источник данных и соответствующую таблицу.
В результате измененные эземпляры MeetingPoint, так же как и экземпляры Terminal, будут сохраняться в базу данных только вместе с экземпляром Airport в одной транзакции.