第十章 将对象映射到 XML - 控制关系映射的形式

控制关系映射的形式

关系以与其他属性相同的方式映射到 XML,具体取决于其中使用的集合的性质:

  • 对于父子关系:

    • 父对象中的关系属性是一个集合属性,特别是对象列表。请参阅控制集合属性的映射。

    • 子对象中的关系属性是对象值属性。

      默认情况下,此关系不会映射为 XML

  • 对于一对多关系:

    • 单个对象中的关系属性是一个集合属性,特别是对象列表。
    • 另一个对象中的关系属性是对象值属性。

    默认情况下,此关系不会映射为 XML

在任何给定时间,只能映射关系的一侧,否则就会出现无限循环。要反转完成映射的方式,请使用 XMLPROJECTION 属性参数。

这个原理最好通过例子来解释。

关系的默认映射

第十章 将对象映射到 XML - 控制关系映射的形式-LMLPHP

Parent 类是 Child 类的父类。

除了关系属性(Children)之外,Parent 类还有两个属性(ParentPropAParentPropB)。

同样,除了关系属性 (MyParent) 之外,Child 类还有两个属性(ChildPropAChildPropB)。

当将这些类映射到 XML 时,默认情况下会得到以下结果:

  • ParentXML 投影包括三个属性的投影:ParentPropAParentPropBChildrenChildren 属性的处理方式与任何其他集合一样。也就是说,默认情况下它被投影为一组嵌套元素。
<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>
  • ChildXML 投影包括两个属性的投影:ChildPropAChildPropB。属性 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 时,会得到以下结果:

  • ParentXML 投影忽略 Children 属性:
<Parent>
  <ParentPropA>12345</ParentPropA>
  <ParentPropB>67890</ParentPropB>
</Parent>

ChildXML 映射包括其所有属性的投影:

<Child>
  <ChildPropA>abc</ChildPropA>
  <ChildPropB>def</ChildPropB>
  <MyParent>
    <ParentPropA>12345</ParentPropA>
    <ParentPropB>67890</ParentPropB>
  </MyParent>
</Child>
11-22 11:36