文章目录
- 第十章 将对象映射到 `XML` - 控制关系映射的形式
- 控制关系映射的形式
- 关系的默认映射
- 相反,映射关系的另一面
第十章 将对象映射到 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>