实际例子:价格目录同步
通用的电子商务案例可以演示XML关系持久性机制的作用。我们来考虑一个示例,在这个例子中XML集成了在线零售商和供应商之间的产品标价目录。
该电子目录包含了已标价的产品列表。在线商店销售产品,通过自己的存货清单来管理(类似于Amazon与Toys-R-Us和运动产品商店之间的关系)。为了精确地和有效地反映价格的变化,在线零售商必须频繁地接收产品价格信息。它把这些信息存放为XML文档,如下所示:
<products> <product prod_id="3" sku="100101"> <description>Athlete mode body fat scale</description> <list_price>100.00</list_price> <drop_price>60.00</drop_price> </product> <product prod_id="4" sku="100102"> <description>Thermometer</description> <list_price>20.00</list_price> <drop_price>11.00</drop_price> </product> </products> | 全面的主要的产品价格列表存储在数据库中,如下所示:
CREATE TABLE PRODUCT ( id INT UNIQUE NOT NULL, description VARCHAR(45) NOT NULL, sku VARCHAR(45) UNIQUE NOT NULL, list_price FLOAT, base_price FLOAT, order_price FLOAT, CONSTRAINT PK_PRODUCT PRIMARY KEY (id ) ) | 在线零售商通过已有的OR映射提供定价目录的Web表现形式,定价产品都表现为demo.Product Java对象:
/** Product对象表现了定价目录项*/ public class Product { int id; String sku; String description; Double listPrice; Double basePrice; Double orderPrice; | 这些对象按照下面的方式映射(为了清楚,我们列出了列名,尽管在属性和列名相匹配的时候Hibernate可以自动地把属性映射为列名):
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="demo"> <class name="Product" table="product" node="product"> <id name="id" type="int" node="@prod_id" column="id"> </id> <property name="sku" node="@sku" column="sku" not-null="true"/> <property name="description" node="description" column="description" not-null="true"/> <property name="listPrice" node="list_price" column="list_price" /> <property name="basePrice" node="drop_price" column="base_price"/> <property name="orderPrice" column="order_price"/> </class> </hibernate-mapping> | 在这种情况下,Hibernate的XML关系持久性就非常方便了。由于该电子商务应用程序接收了包含产品价格更新的XML,它就利用Hibernate的XML持久性机制把这些XML写入到产品数据库中。Hibernate提供了几种XML持久性选择,包括Hibernate的saveOrUpdate方法:
document = saxReader.read(inputXML); List users = document.selectNodes("//product"); try { Session session = ibernateUtil.sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Session dom4jSession = session.openSession(EntityMode.DOM4J); Iterator iter = users.iterator(); while (iter.hasNext()) { Object next = iter.next(); dom4jSession.saveOrUpdate("demo.Product", next ); }// end while transaction.commit(); session.close(); | XML映射语法
上面的例子中使用的映射文件不用于Hibernate 2的映射文件。Hibernate 3引入了几种专门用于XML持久性的新映射类型。
主要的新映射属性是节点(node),它与被映射的XML文档中的一个元素或文档中的属性相关联。
一个"节点"可能表现为下面的某种映射:
· "element-name(元素名)":在例子中,<product></product>元素会被表示为node="product"。
· "@attribute-name(属性名)":在例子中,node="@sku"会被映射为XML属性<product sku="1001001">。
· ".(句点)":映射为元素的父元素(例如<products>就<product>是的父元素)。
· "element-name/@attribute-name(元素名/属性名)":映射为命名元素的属性(product/@sku)。
XML持久性并非Hibernate的主要任务
Hibernate 3框架组件高效率地实现了目前最通用的一些方法(除了LDAP之外)。Java社团现在拥有了一套框架组件,它为易于实现的OR和XML持久性提供了高效率的和一致性的方法。
在我们知道上面一些内容之后,了解Hibernate项目的任务是很重要的。尽管Hibernate 3的XML特性非常有用、有吸引力,但是它们并不是用来代替最流行的XML编组(marshalling)和转换(transformation)框架组件的。不管它的OR映射解决方案多么完善,我们都不应该期待Hibernate成为主流的XML维护框架组件(根据Hibernate的作者Gavin King在TheServerSide Java Symposium 2005上的发言)。
由于这个原因,你应该把XML持久性特性看作是已有的强大的Hibernate框架组件的有用的扩展,它允许你轻易地把现在流行的其它的数据表现机制合并到自己的应用程序中。但是,如果你必须处理复杂的集成和转换情况,最好去寻找其它的XML专用的框架组件。
[上一页] [1] [2]
|