3.5.3.1.4. 键值对容器

KeyValueContainerKeyValueCollectionContainer 是用来处理 KeyValueEntity 的。这个实体可以包含在运行时定义的任意数量的属性。

键值对容器定义了下列特殊的方法:

  • addProperty() 由于容器可以保存带有任意数量属性的实体,需要在使用此方法的时候指定是添加什么属性。这个方法接收属性名称和对应的类型,类型可以是数据类型格式,也可以是 Java 类。在使用 Java 类的情况下,这个类要么是实体类,要么是有数据类型支持的类。

  • setIdName() 是一个可选择调用的方法,通过这个方法可以将一个属性定义为实体的标识符属性。也就是说,保存在此容器内的 KeyValueEntity 实体将使用指定的属性作为标识符。否则,KeyValueEntity 将使用随机生成的 UUID 作为标识符。

  • getEntityMetaClass() 返回 MetaClass 接口的动态实现类,这个类反映了 KeyValueEntity 实例的当前结构,实例的结构是通过之前调用 addProperty() 来定义的。

KeyValueContainerKeyValueCollectionContainer 也可以在界面 XML 描述中使用 KeyValueInstanceKeyValueCollection 元素定义。

KeyValue 容器的 XML 定义必须包含 properties 元素,用来定义 KeyValueEntity 实例属性。property 元素的顺序必须与查询返回的列顺序一致。比如,在下面的定义中,customer 属性会从 o.customer 列获取数据,sumsum(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 不是持久化实体,不能用标准的持久化机制保存。