3.5.3.1.4. 键值对容器
KeyValueContainer
和 KeyValueCollectionContainer
是用来处理 KeyValueEntity
的。这个实体可以包含在运行时定义的任意数量的属性。
键值对容器定义了下列特殊的方法:
-
addProperty()
由于容器可以保存带有任意数量属性的实体,需要在使用此方法的时候指定是添加什么属性。这个方法接收属性名称和对应的类型,类型可以是数据类型格式,也可以是 Java 类。在使用 Java 类的情况下,这个类要么是实体类,要么是有数据类型支持的类。 -
setIdName()
是一个可选择调用的方法,通过这个方法可以将一个属性定义为实体的标识符属性。也就是说,保存在此容器内的KeyValueEntity
实体将使用指定的属性作为标识符。否则,KeyValueEntity
将使用随机生成的 UUID 作为标识符。 -
getEntityMetaClass()
返回MetaClass
接口的动态实现类,这个类反映了KeyValueEntity
实例的当前结构,实例的结构是通过之前调用addProperty()
来定义的。
KeyValueContainer
和 KeyValueCollectionContainer
也可以在界面 XML 描述中使用 KeyValueInstance
和 KeyValueCollection
元素定义。
KeyValue 容器的 XML 定义必须包含 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
不是持久化实体,不能用标准的持久化机制保存。