XML映射
注意这是Hibernate 3.0的一个实验性的特性。这一特性仍在积极开发中。
用XML数据进行工作
Hibernate使得你可以用XML数据来进行工作,恰如你用持久化的POJO进行工作那样。解析过的XML树
可以被认为是另外一种在对象层面上代替POJO来表示关系型数据的途径.
Hibernate支持采用dom4j作为操作XML树的API。你可以写一个查询从数据库中检索出
dom4j树,随后你对这颗树做的任何修改都将自动同步回数据库。你甚至可以用dom4j解析
一篇XML文档,然后使用Hibernate的任一基本操作将它写入数据库:
persist(), saveOrUpdate(), merge(), delete(), replicate()
(合并操作merge()目前还不支持)。
这一特性可以应用在很多场合,包括数据导入导出,通过JMS或SOAP表现实体数据以及
基于XSLT的报表。
一个单一的映射就可以将类的属性和XML文档的节点同时映射到数据库。如果不需要映射类,
它也可以用来只映射XML文档。
指定同时映射XML和类
这是一个同时映射POJO和XML的例子:
...
]]>
只定义XML映射
这是一个不映射POJO的例子:
...
]]>
这个映射使得你既可以把数据作为一棵dom4j树那样访问,又可以作为由属性键值对(java Maps)
组成的图那样访问。属性名字是纯粹逻辑上的结构,你可以在HQL查询中引用它。
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不能很好地处理
循环引用!
...
]]>
在这个例子中,我们决定嵌入帐目号码(account id)的集合,但不嵌入实际的帐目数据。下面的HQL查询:
返回的数据集将是这样:
Gavin
A
King
...
]]>
如果你把一对多映射<one-to-many>的embed-xml属性置为真(embed-xml="true"),
则数据看上去就像这样:
100.29
-2370.34
Gavin
A
King
...
]]>
操作XML数据
让我们来读入和更新应用程序中的XML文档。通过获取一个dom4j会话可以做到这一点:
将这一特色与Hibernate的replicate()操作结合起来而实现的基于XML的数据导入/导出将非常有用.