ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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> ```