非常感謝最近發布的Hibernate 3中的XML持久性特性,Java開發者現在擁有了一個框架組件,它為易於實現的對象關系(OR)和XML持久性提供了高效的和一致的方法。
Hibernate的易用性、高性能和對象關系持久性等高級特性給IT界帶來了很大的驚喜。Hibernate的最新版本(版本3,3月29日發布的)給產品API帶來了一個重要的新特性:XML持久性。有了Hibernate 3之後,Java應用程序開發者可以輕易地把XML文檔合並到關系型數據庫中。
這個新特性應該明確地告訴已有的Hibernate開發者,因為它也遵循POJO(純的舊Java對象)相同的一致性方法,需要學習的知識最少。XML持久性的優點也應該介紹給新用戶。本文講解的是Hibernate 3持久性方法。
XML持久性為什麼重要
大多數大型商業數據庫都支持某種形式的本地XML持久性。由於XML持久性是一個相對較新的機制--即使對大型廠商也是如此,這個領域中的標准還在不斷地浮現。其結果是,為了把無處不在的關系型持久性機制與日益增長的XML解決方案集成在一起,架構師必須依賴廠商特定的特性或者實現定制的XML持久性框架組件。這兩個選擇都沒有太大的吸引力。廠商特定的特性不是普及的,因為可能產生廠商封鎖(lock-in),而定制的框架組件實現可能耗費大量的時間和財力,導致代碼難於維護。
在OR(對象關系)持久性方面,Hibernate XML持久性是一個自然而然的解決方案。它可以跨越Hibernate支持的所有關系型平台(如虛擬的或真實的關系型平台)移動,允許自由的遷移對象、基於XML的應用程序和集成解決方案而不用擔心下層的關系型實現方法。
體系結構的細節信息
Hibernate是一個良好架構的框架組件,它無縫地利用了本地的環境,不需要用戶進行任何特殊的干涉或安裝操作。從一個數據庫切換到另外一個數據庫通常只需要改變驅動程序,並配置Hibernate(在線配置設置信息)來使用另外一種數據庫語言。
Hibernate利用dom4j框架組件進行XML的分析和維護。如果需要完全利用Hibernate的XML特性,你就必須對dom4j非常熟悉。一般來說,你會發現dom4j比Java提供的JAXP或與JAXP兼容的XML分析器要容易使用一些。它要求我們學習的相關知識較少,並且利用最少的dom4j知識你就能夠高效率地使用Hibernate 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 )
)
/** Product對象表現了定價目錄項*/
public class Product {
int id;
String sku;
String description;
Double listPrice;
Double basePrice;
Double orderPrice;
<?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>
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();