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不能很好地处理 循环引用!

  1. <class name="Customer"
  2. table="CUSTOMER"
  3. node="customer">
  4. <id name="id"
  5. column="CUST_ID"
  6. node="@id"/>
  7. <map name="accounts"
  8. node="."
  9. embed-xml="true">
  10. <key column="CUSTOMER_ID"
  11. not-null="true"/>
  12. <map-key column="SHORT_DESC"
  13. node="@short-desc"
  14. type="string"/>
  15. <one-to-many entity-name="Account"
  16. embed-xml="false"
  17. node="account"/>
  18. </map>
  19. <component name="name"
  20. node="name">
  21. <property name="firstName"
  22. node="first-name"/>
  23. <property name="initial"
  24. node="initial"/>
  25. <property name="lastName"
  26. node="last-name"/>
  27. </component>
  28. ...
  29. </class>

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

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

返回的数据集将是这样:

  1. <customer id="123456789">
  2. <account id="987632567" short-desc="Savings"/>
  3. <account id="985612323" short-desc="Credit Card"/>
  4. <name>
  5. <first-name>Gavin</first-name>
  6. <initial>A</initial>
  7. <last-name>King</last-name>
  8. </name>
  9. ...
  10. </customer>

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

  1. <customer id="123456789">
  2. <account id="987632567" short-desc="Savings">
  3. <customer id="123456789"/>
  4. <balance>100.29</balance>
  5. </account>
  6. <account id="985612323" short-desc="Credit Card">
  7. <customer id="123456789"/>
  8. <balance>-2370.34</balance>
  9. </account>
  10. <name>
  11. <first-name>Gavin</first-name>
  12. <initial>A</initial>
  13. <last-name>King</last-name>
  14. </name>
  15. ...
  16. </customer>