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 不是持久化实体,不能用标准的持久化机制保存。