3.5.3.4.1. Декларативное создание компонентов данных

Самый простой способ создать компоненты данных - это определить их в XML-дескрипторе экрана внутри элемента <data>.

Рассмотрим для примера модель данных, содержащую сущности Customer, Order и OrderLine. Дескриптор экрана редактирования сущности Order может иметь следующее определение:

<data> (1)
    <instance id="orderDc" class="com.company.sales.entity.Order"> (2)
        <view extends="_local"> (3)
            <property name="lines" view="_minimal">
                <property name="product" view="_local"/>
                <property name="quantity"/>
            </property>
            <property name="customer" view="_minimal"/>
        </view>

        <loader/> (4)

        <collection id="linesDc" property="lines"/> (5)
    </instance>

    <collection id="customersDc" class="com.company.sales.entity.Customer" view="_minimal"> (6)
        <loader> (7)
            <query><![CDATA[select e from sales_Customer e]]></query>
        </loader>
    </collection>
</data>

В этом случае будут созданы следующие компоненты данных:

1 - Экземпляр DataContext.
2 - Контейнер InstanceContainer для сущности Order.
3 - Встроенное описание представления экземпляра сущности, находящегося в контейнере. Встроенные представления могут расширять общие (заданные в views.xml).
4 - InstanceLoader загружающий экземпляры сущности Order.
5 - Контейнер CollectionPropertyContainer для сущности OrderLines. Этот контейнер привязан к атрибуту-коллекции Order.lines.
6 - Контейнер CollectionContainer для сущности Customer. Атрибут view может указывать на общее представление.
7 - CollectionLoader, загружающий экземпляры сущности Customer по определённому запросу.

Контейнеры данных используются в визуальных компонентах следующим образом:

<layout>
    <dateField dataContainer="orderDc" property="date"/> (1)
    <form id="form" dataContainer="orderDc"> (2)
        <column>
            <textField property="amount"/>
            <lookupPickerField id="customerField" property="customer"
                               optionsContainer="customersDc"/> (3)
        </column>
    </form>
    <table dataContainer="linesDc"> (4)
        <columns>
            <column id="product"/>
            <column id="quantity"/>
        </columns>
    </table>
1 Отдельные поля имеют атрибуты dataContainer и property.
2 Элемент form распространяет свой dataContainer на все вложенные поля, поэтому они требуют только указания атрибута property.
3 Поля выбора имеют атрибут optionsContainer.
4 У таблиц есть только атрибут dataContainer.