第十章 将对象映射到 XML
- 控制关系映射的形式
控制关系映射的形式
关系以与其他属性相同的方式映射到 XML
,具体取决于其中使用的集合的性质:
-
对于父子关系:
-
父对象中的关系属性是一个集合属性,特别是对象列表。请参阅控制集合属性的映射。
-
子对象中的关系属性是对象值属性。
默认情况下,此关系不会映射为
XML
。
-
-
对于一对多关系:
- 单个对象中的关系属性是一个集合属性,特别是对象列表。
- 另一个对象中的关系属性是对象值属性。
默认情况下,此关系不会映射为
XML
。
在任何给定时间,只能映射关系的一侧,否则就会出现无限循环。要反转完成映射的方式,请使用 XMLPROJECTION
属性参数。
这个原理最好通过例子来解释。
关系的默认映射
Parent
类是 Child
类的父类。
除了关系属性(Children
)之外,Parent
类还有两个属性(ParentPropA
和 ParentPropB
)。
同样,除了关系属性 (MyParent
) 之外,Child
类还有两个属性(ChildPropA
和 ChildPropB
)。
当将这些类映射到 XML
时,默认情况下会得到以下结果:
Parent
的XML
投影包括三个属性的投影:ParentPropA
、ParentPropB
和Children
。Children
属性的处理方式与任何其他集合一样。也就是说,默认情况下它被投影为一组嵌套元素。
<Parent>
<ParentPropA>12345</ParentPropA>
<ParentPropB>67890</ParentPropB>
<Children>
<Child>
<ChildPropA>abc</ChildPropA>
<ChildPropB>def</ChildPropB>
</Child>
<Child>
<ChildPropA>ghi</ChildPropA>
<ChildPropB>jkl</ChildPropB>
</Child>
</Children>
</Parent>
Child
的XML
投影包括两个属性的投影:ChildPropA
和ChildPropB
。属性MyParent
被忽略。
<Child>
<ChildPropA>abc</ChildPropA>
<ChildPropB>def</ChildPropB>
</Child>
对于一对多关系也是如此。具体来说,一侧的对象包括关系属性的映射。多方的对象不包括关系属性的映射。
相反,映射关系的另一面
通过在两个类的关系属性中指定 XMLPROJECTION
参数,可以映射关系的另一端。以下示例是默认示例的变体。
Class Relationships2.Parent Extends (%Persistent, %XML.Adaptor)
{
Property ParentPropA As %String;
Property ParentPropB As %String;
Relationship Children As Child(XMLPROJECTION = "NONE") [ Cardinality = children, Inverse = MyParent ];
}
同样,Child
类如下:
Class Relationships2.Child Extends (%Persistent, %XML.Adaptor)
{
Property ChildPropA As %String;
Property ChildPropB As %String;
Relationship MyParent As Parent (XMLPROJECTION="element") [ Cardinality = parent, Inverse = Children ];
}
当将这些类映射到 XML
时,会得到以下结果:
Parent
的XML
投影忽略Children
属性:
<Parent>
<ParentPropA>12345</ParentPropA>
<ParentPropB>67890</ParentPropB>
</Parent>
Child
的 XML
映射包括其所有属性的投影:
<Child>
<ChildPropA>abc</ChildPropA>
<ChildPropB>def</ChildPropB>
<MyParent>
<ParentPropA>12345</ParentPropA>
<ParentPropB>67890</ParentPropB>
</MyParent>
</Child>