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
является неперсистентной и не может быть сохранена стандартным механизмом работы с БД.