第十章 将对象映射到 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>