18.2. XML映射元数据

许多Hibernate映射元素具有node属性。这使你可以指定用来保存 属性或实体数据的XML属性或元素。node属性必须是下列格式之一:

  • "element-name" - 映射为指定的XML元素

  • "@attribute-name" - 映射为指定的XML属性

  • "." - 映射为父元素

  • "element-name/@attribute-name" - 映射为指定元素的指定属性

对于集合和单值的关联,有一个额外的embed-xml属性可用。 这个属性的缺省值是真(embed-xml="true")。如果embed-xml="true", 则对应于被关联实体或值类型的集合的XML树将直接嵌入拥有这些关联的实体的XML树中。 否则,如果embed-xml="false",那么对于单值的关联,仅被引用的实体的标识符出现在 XML树中(被引用实体本身不出现),而集合则根本不出现。

你应该小心,不要让太多关联的embed-xml属性为真(embed-xml="true"),因为XML不能很好地处理 循环引用!

<class name="Customer" 
        table="CUSTOMER" 
        node="customer">

    <id name="id" 
            column="CUST_ID" 
            node="@id"/>

    <map name="accounts" 
            node="." 
            embed-xml="true">
        <key column="CUSTOMER_ID" 
                not-null="true"/>
        <map-key column="SHORT_DESC" 
                node="@short-desc" 
                type="string"/>
        <one-to-many entity-name="Account"
                embed-xml="false" 
                node="account"/>
    </map>

    <component name="name" 
            node="name">
        <property name="firstName" 
                node="first-name"/>
        <property name="initial" 
                node="initial"/>
        <property name="lastName" 
                node="last-name"/>
    </component>

    ...

</class>

在这个例子中,我们决定嵌入帐目号码(account id)的集合,但不嵌入实际的帐目数据。下面的HQL查询:

from Customer c left join fetch c.accounts where c.lastName like :lastName

返回的数据集将是这样:

<customer id="123456789">
    <account id="987632567" short-desc="Savings"/>
    <account id="985612323" short-desc="Credit Card"/>
    <name>
        <first-name>Gavin</first-name>
        <initial>A</initial>
        <last-name>King</last-name>
    </name>
    ...
</customer>

如果你把一对多映射&lt;one-to-many&gt;的embed-xml属性置为真(embed-xml="true"), 则数据看上去就像这样:

<customer id="123456789">
    <account id="987632567" short-desc="Savings">
        <customer id="123456789"/>
        <balance>100.29</balance>
    </account>
    <account id="985612323" short-desc="Credit Card">
        <customer id="123456789"/>
        <balance>-2370.34</balance>
    </account>
    <name>
        <first-name>Gavin</first-name>
        <initial>A</initial>
        <last-name>King</last-name>
    </name>
    ...
</customer>