第 19 章 XML映射

注意这是Hibernate 3.0的一个实验性的特性。这一特性仍在积极开发中。

19.1. 用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文档。

19.1.1. 指定同时映射XML和类

这是一个同时映射POJO和XML的例子:

<class name="Account" table="ACCOUNTS" node="account"><id name="accountId" column="ACCOUNT_ID" node="@id"/><many-to-one name="customer" column="CUSTOMER_ID" node="customer/@id" embed-xml="false"/><property name="balance" column="BALANCE" node="balance"/>...</class>

19.1.2. 只定义XML映射

这是一个不映射POJO的例子:

<class entity-name="Account" table="ACCOUNTS" node="account"><id name="id" column="ACCOUNT_ID" node="@id" type="string"/><many-to-one name="customerId" column="CUSTOMER_ID" node="customer/@id" embed-xml="false" entity-name="Customer"/><property name="balance" column="BALANCE" node="balance" type="big_decimal"/>...</class>

这个映射使得你既可以把数据作为一棵dom4j树那样访问,又可以作为由属性键值对(java Maps) 组成的图那样访问。属性名字是纯粹逻辑上的结构,你可以在HQL查询中引用它。

19.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>

如果你把一对多映射<one-to-many>的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>

19.3. 操作XML数据

让我们来读入和更新应用程序中的XML文档。通过获取一个dom4j会话可以做到这一点:

Document doc = ....;Session session = factory.openSession();
Session dom4jSession = session.getSession(EntityMode.DOM4J);
Transaction tx = session.beginTransaction();List results = dom4jSession.createQuery("from Customer c left join fetch c.accounts where c.lastName like :lastName").list();
for ( int i=0; i<results.size(); i++ ) {//add the customer data to the XML documentElement customer = (Element) results.get(i);doc.add(customer);
}tx.commit();
session.close();
Session session = factory.openSession();
Session dom4jSession = session.getSession(EntityMode.DOM4J);
Transaction tx = session.beginTransaction();Element cust = (Element) dom4jSession.get("Customer", customerId);
for ( int i=0; i<results.size(); i++ ) {Element customer = (Element) results.get(i);//change the customer name in the XML and databaseElement name = customer.element("name");name.element("first-name").setText(firstName);name.element("initial").setText(initial);name.element("last-name").setText(lastName);
}tx.commit();
session.close();

将这一特色与Hibernate的replicate()操作结合起来而实现的基于XML的数据导入/导出将非常有用.

转载于:https://www.cnblogs.com/nieshanfeng/archive/2011/08/23/2151267.html

第 19 章 XML映射相关推荐

  1. Mybatis学习--Mapper.xml映射文件

    简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...

  2. 第19章,运维自动化之系统安装

    更多内容请点击: Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) https://blog.51cto.com/13683480/2095439 第19章,运维自 ...

  3. 第19章 数据库备份与恢复

    第19章 数据库备份与恢复 文章目录 1. 物理备份与逻辑备份 2. mysqldump实现逻辑备份 2.1 备份一个数据库 2.2 备份全部数据库 2.3 备份部分数据库 2.4 备份部分表 2.5 ...

  4. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  5. 读书笔记:《流畅的Python》第19章 动态属性和特性

    # 第19章 动态属性和特性""" 属性(attribute):数据的属性和处理数据的方法统称属性,方法只是可调用的属性. 特性(property)除此之外,我们海可以创 ...

  6. 「mysql是怎样运行的」第19章 从猫爷被杀说起---事务简介

    「mysql是怎样运行的」第19章 从猫爷被杀说起-事务简介 文章目录 「mysql是怎样运行的」第19章 从猫爷被杀说起---事务简介 @[toc] 一.事务的起源 概述 原子性(Atomicity ...

  7. Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin

    Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin 这个问题自己大致在 ...

  8. 第19章 解释器模式(Interpreter Pattern)

    原文 第19章 解释器模式(Interpreter Pattern) 解释器模式 导读:解释器模式,平常用的比较的少,所以在写这个模式之前在博客园搜索了一番,看完之后那叫一个头大.篇幅很长,我鼓足了劲 ...

  9. Windows核心编程 第十七章 -内存映射文件(上)

    第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...

最新文章

  1. bat no moudle named xxx
  2. Windows Java、Tomcat、MySQL安装过程
  3. 索引的使用—— 验证索引提升查询效率 || 避免索引失效 —— 全值匹配 /最左前缀法则/范围查询右边的列,不能使用索引/不要在索引列上进行运算操作/字符串不加单引号,造成索引失效
  4. Python开发中有可能遇到的套接字重复使用错误
  5. Rust——Macos安装使用
  6. IDEA依赖冲突分析神器—Maven Helper
  7. 你自认为了解微信小程序?醒醒吧!
  8. [swift] LeetCode 21. Merge Two Sorted Lists
  9. 有关8086必须记住的几个数(持续更新)
  10. android 免 root修改位置打卡
  11. java 支持哪些字体_java有哪些字体
  12. 苹果开发者账号开启双重认证教程
  13. 算法简介:不撞南墙不回头----深度优先搜索算法(DFS)
  14. 晶振电路并联一个电阻作用
  15. 飞腾CPU BIOS固件生成教程
  16. VUE2.0全局方法注册
  17. 微信支付开发 认清微信支付v2和v3
  18. 云片:批量发送超级短信示例
  19. 【传感器模块】 HC-SR501 人体红外感应模块 热释电 红外传感器
  20. 6-7 使用函数求素数和 (20 分)

热门文章

  1. 使用FoundationDB高效地将SQL数据映射到NoSQL存储系统中
  2. python 发邮件-带附件-文本-html
  3. php代码审计之MetInfo5.3盲注
  4. mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高(问题原因还待考证)...
  5. linux下多线程的调试
  6. 命令行的基本使用方法(权限)
  7. IOS学习之路--OC的基础知识
  8. vs2005无法断点调试网站,断点失效
  9. [HNOI2008 GT考试]
  10. 装完Windows 7后开启硬盘AHCI模式的方法