5.8.4.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 в одной транзакции.