3.5.3.1.4. Контейнеры KeyValue

Контейнеры KeyValueContainer и KeyValueCollectionContainer предназначены для работы с сущностями типа KeyValueEntity. Такая сущность может содержать произвольный набор атрибутов, задаваемый во время работы приложения.

Контейнеры KeyValue содержат следующие специфичные методы:

  • addProperty() - так как контейнер может содержать сущности с произвольным количеством атрибутов, с помощью данного метода необходимо указать, какие атрибуты ожидаются. Он принимает имя атрибута и его тип в виде Datatype или Java-класса. В последнем случае класс должен быть либо сущностью, либо классом, поддерживаемым одним из типов данных (datatypes).

  • setIdName() - опциональный метод, позволяющий назначить один из атрибутов идентификатором сущности. Это означает, что экземпляры KeyValueEntity, содержащиеся в данном контейнере, будут иметь идентификаторы, получаемые из данного атрибута. В противном случае, экземпляры KeyValueEntity получают случайно сгенерированные UUIDs.

  • getEntityMetaClass() возвращает динамическую реализацию интерфейса MetaClass, которая представляет текущую схему экземпляров KeyValueEntity, заданную вызовами метода addProperty().

KeyValueContainer и KeyValueCollectionContainer могут быть заданы декларативно в XML-дескрипторе элементами keyValueInstance и keyValueCollection.

XML-описание контейнеров KeyValue должно содержать элемент properties, который задает атрибуты KeyValueEntity. Порядок вложенных элементов property должен соответствовать порядку колонок в результирующем наборе, возвращаемом запросом. Например, в следующем определении атрибут customer получит значение из колонки o.customer, а атрибут sum из колонки sum(o.amount):

<data readOnly="true">
        <keyValueCollection id="salesDc">
            <loader id="salesDl">
                <query>
                    <![CDATA[select o.customer, sum(o.amount) from sales_Order o group by o.customer]]>
                </query>
            </loader>
            <properties>
                <property name="customer" class="com.company.sales.entity.Customer"/>
                <property name="sum" datatype="decimal"/>
            </properties>
        </keyValueCollection>
</data>

Контейнеры KeyValue предназначены только для чтения данных, так как сущность KeyValueEntity является неперсистентной и не может быть сохранена стандартным механизмом работы с БД.