技术开发 频道

用Hibernate3.1实现XML和数据库的同步



    【IT168 专稿】Hibernate是一套开源的用于对象/关系持久化和查询服务的Java库。现在Hibernate的最新版本是3.1。在这个版本中引入了一个新的特性:XML到数据库映射(也可以看做是XML和数据库的同步)。这个功能允许程序员将基于XML文档的数据映射成数据库(在当前版本的Hibernate中支持DB2、MySQL、Oracle和PostgreSQL)。通过使用Hibernate,可以将XML文档的节点(Node)映射成数据库的列。每一个XML文件直接被映射成一个数据库表,在这个过程中并不要求一个POJO。Hibernate可以根据需要生成相应的SQL(包括create、update、delete、insert等)。   我们还可以通过Hibernate的配置文件生成新表,并将XML数据添加到数据库中。还能以XML格式得到数据库表中的数据,并通过XML的方式增加或更新数据。同时,Hibernate3.1还支持dom4j API,并且支持Ant。在本文中将学习如何使用Hibernate3.1开发一个基于XML映射的应用程序。
 
我们要做的第一项工作就是设计数据库配置属性,这些属性可以在hibernate.properties中设置。这此属性主要包括要连接的数据库,JDBC驱动类以及连接数据库的连接字符串。还需要设置一个映射文件hbm.xml。这个文件指定了XML文档的节点和相应的数据表中的列的对应关系。Java Bean要映射的数据表名也在这个文件中指定。我们可以使用org.hibernate.tool.hbm2ddl.SchemaExport工具将映射文件映射到数据表上。本文将详细描述如何将一个Catalog.hbm.xml文件映射到一个Oracle数据表上。
 
一、准备工作

在开始本文的讲解前需要先安装用于开发的Hibernate应用程序包,我们可以从www.hibernate.org下载Hibernate的3.1版。然后需要安装Oracle 10g,详细的安装过程请参考相关的文章。最后,我们将本程序所需要的Hibernate的.jar文件加到加到CLASSPATH环境变量中。这些.jar文件如表1所示:

.jar文件
描述
hibernate3.jar
这是hibernate主要的jar包,其中org.hibernate.tool.hbm2ddl.SchemaExport就包含在这个文件中
dom4j-1.6.1.jar
commons-logging-1.0.4.jar
commons-collections-2.1.1.jar
ehcache-1.1.jar
cglib-2.1.3.jar
jta.jar
asm.jar
antlr-2.7.6rc1.jar
jaxen-1.1-beta-7.jar
这九个jar文件是包含了Hibernate的辅助类
classes12.jar or ojdbc14.jar
这是操作Oracle数据库的JDBC类
 
 
                                                              表1 Hibernate的jar文件
    在本节中,我们将学习如何从一个XML映射文件生成一个数据库表。这个工作可以通过hibernate.properties文件实现,这个文件将指定数据库的设置信息和hbm.xml映射文件。如果你使用一个配置文件(hibernate.cfg.xml)来指定数据库属性,那么hibernate.properties文件将不再需要。.hbm.xml文件包含了将XML文档节点映射成数据库表的类的定义以及表名和XML文档相对应的列。除了这些,还需要指定列的类型、长度、是否为null以及是否唯一。表2列了一些主要的映射文件设置项。

设置项
描述
hibernate-mapping
这是根设置项,它包含了schema和package属性和class字设置项
class
指定映射到数据库表的实体。包括table、schema、entity-name和node属性。它的子设置项有id、property、set和list。
id
在定义类时要求的设置项。包括column、type和length属性和column、generator设置项
property
指定某个实体的属性和相应的数据库表列。包含type、column、length和not-null属性。

 
2  Hibernate映射文件的主要设置项
 
在本文的例子的映射文件指定了一个实体Catalog,其中包含了Catalog的节点(也就是列)。XML文档节点在节点属性中指定。这个例子映射文件Catalog.hbm.xml在表3中指定。其中<generator class="native"/>指定了唯一标识符的产生策略。我们可以在Hibernate.properties文件中指定JDBC配置信息。在hibernate.properties文件中包含的属性通过<property>=<value>指定。JDBC的部分配置将在表3中列出。
 

属性
描述
hibernate.connection.driver_class
连接数据库的驱动类
hibernate.connection.url
用于连接数据库的连接字符串
hibernate.dialect
数据库类型
hibernate.connection.username
登录数据库的用户名
hibernate.connection.password
登录数据库的密码

 
3. Hibernate.properties的部分属性
 
    在本文的例子中将数据库驱动类指定为oracle.jdbc.driver.OracleDriver。连接字符串使用Oracle的第四种类型连接字符串,数据库类型为Oracle。
 
 
hibernate.properties的设置如下所示:

hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.url=jdbc:oracle:thin:@localhost:1521:OracleDB hibernate.connection.username=user hibernate.connection.password=mypw hibernate.dialect=org.hibernate.dialect.OracleDialect
在本例中将使用org.hibernate.tool.hbm2ddl.SchemaExport工具根据Catalog.hbm.xml和hibernate.properties文件来产生一个Oracle数据表。
 
    首先将hibernate.properties和Catalog.hbm.xml文件复制到同一个目录下。如d:\hibernate。然后启动Oracle数据库服务,接下来使用如下命令产生一个Oracle数据库表:

java org.hibernate.tool.hbm2ddl.SchemaExport --properties=hibernate.properties Catalog.hbm.xml
在执行完上面的命令后,在Oracle数据库就建立了一个user.Catalog表.


    在这一节,我们将开发一个Java应用程序就于将XML文档转换成在上一节所描述的数据表。 我们将使用表示所描述
catalog.xml中的数据。
    这个Java应用程序将映射文件,用于数据持久化的属性文件集成到了一起。首先将Catalog.hbm.xml和
hibernate.properties文件复制到同一个目录。并将这个目录加到CLASSPATH中。在Java应用程序中使用import导入
org.hibernate包和dom4j包。
org.hibernate.Session是主要的运行时接口,它负责将Java应用程序和Hibernate连接起来。你可以使用它在数据库表中增加、获得、更新和删除XML数据。我们可以从一个SessionFactory中获得一个Session对象。这个SessionFactory接口提供了openSession方法用来创建一个数据库连接以及打开一个连接会话。org.hibernate.cfg.Configuration类用来指定配置属性和创建一个SessionFactory的映射文件。下面的代码将创建一个配置对象:

Configuration config=new Configuration();
下面的代码将映射文件catalog.hbm.xml加入到配置中:

config.addFile("catalog.hbm.xml");
现在映射文件Catalog.hbm.xml以及JDBC属性文件在相同的目录,并且应用程序使用配置对象获得这此文件的信息。下面的代码将创建一个SessionFactory对象:

SessionFactory sessionFactory=config.buildSessioFactory();
 接下来,将向使用SchemaExport工具创建的数据表中加入数据,首先从SessionFactory对象中得到一个Session对象:

 
Session sess =sessionFactory.openSession();
 
 
    下面的代码将得一个Transaction对象,我们可以使用这个对象向数据表中加入数据:
 
org.hibernate.Transaction tx = sess.beginTransaction();
 
 
    使用DOM4J模式开始一个会话,第二个会话和第一个主会话有同样的连接、事务和上下文属性:
 
Session dom4jSession = session.getSession(EntityMode.DOM4J);
 
    下面将创建一个SAXReader对象用于分析描述数据表的XML文档。我们可以使用read(File)方法来分析catalog.xml文件,代码如下:
SAXReader saxReader = new SAXReader(); Document document = saxReader.read(new File("c:/Hibernate/catalog.xml"));
 下面的代码将获得文档对象中catalog节点的列表,并且创建一个Iterator对象用于浏览列表中止数据:
 
List list = document.selectNodes("//catalog");
Iterator iter = list.iterator();
 
Iterate可以枚举列表中的对象,并且从列表中获得相应的节点。我们可以使用save(String entityName,Object object)方法来将节点数据保存在数据库中。其实save方法并不会真的将数据保存在数据库中,要想物理保存,必须使用flush方法来同步数据库和XML文档,代码如下:

while(iter.hasNext()) { Object catalog = iter.next(); dom4jSession.save("Catalog", catalog); }
 最后,我们将使用flush来保存Session,使用commit来提交事务,使用close来关闭会话,代码如下:

session.flush();
tx.commit();
session.close();


    在这一节中我们将从一个数据表中以XML的形式得到数据。和上一节一样,需要创建一个配置对象,并且将映射文件catalog.hbm.xml加到配置对象中,代码如下:
 
Configuration config = new Configuration();
config.addFile("catalog.hbm.xml");
 
    然后从配置对象创建一个SessionFactory对象,并且使用SessionFactory打开一个会话对象:
 
SessionFactory sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
 
    使用DOM4J实体模式创建一个新会话,代码如下:
 
Session dom4jSession = session.getSession(EntityMode.DOM4J);
 
    开始一个新事务,代码如下:
tx = session.beginTransaction();
 
下一步将使用Catalog中的数据来创建一个XML文档。首先,使用静态方法createDocument方法(在DocumentHelper类中)来创建一个Document对象。并将catalogs元素加到Document对象中,代码如下:
 
Document document = DocumentHelper.createDocument();
Element rootElement = document.addElement("catalogs");
 
    创建一个Hibernate查询(HQL)用来查询表中的数据。HQL的语法类似SQL的语法。在HQL中并不要求Select子句。在From子句后面需要加实体名,而不是数据库表名,HQL的代码如下:
 
String hqlQuery ="FROM Catalog";
 
    在写完HQL后,需要使用Session对象的createQuery(hqlQuery)方法创建一个查询对象,并通过list()方法得到相应的查询结果。代码如下:
 
List results = dom4jSession.createQuery(hqlQuery).list();
 
    下面的代码将枚举返回结果中所有的数据。每一行对应XML文档中的一个catalog节点。并将catalog加入到每一个文档对象的根元素中:
 
for (int i = 0; i < results.size(); i++)
{
        Element catalog = (Element) results.get(i);
        rootElement.add(catalog);
    }
 
    下面的代码使用XMLWriter对象将数据输出到XML文档对象中:
 
XMLWriter output = new XMLWriter(new FileWriter(
                        new File("c:/catalog/catalog.xml")));
output.write(document);
 


在这一节我们将使用Hibernate API删除一行记录。我们需要在catalog-delete.xml中指定要删除的行。首先创建一个Configuration对象,并将catalog.hbm.xml加入到Configuration对象中:

Configuration config = new Configuration();
config.addFile("catalog.hbm.xml");
 
    下面的代码将创建一个SessionFactory对象,并使用openSession方法打开一个会话:
 
SessionFactory sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
 
下面的代码将使用DOM4J模式创建一个Session对象。这个Session对象和DOM4J将拥有同样的连接、事务和上下文属性,代码如下:
 
Session dom4jSession = session.getSession(EntityMode.DOM4J);
 
    创建一个事务,代码如下:
tx = session.beginTransaction();
 
创建一个SAXReader对象用来分析XML文档:catalog-delete.xml,代码如下:
 
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(xmlDocument);
 
下面的代码将得到catalog节点对象,并创建一个Iterator对象(为了枚举这个节点的字节点),代码如下:
 
List list = document.selectNodes("//catalog");
Iterator iter = list.iterator();
 
 
    下面的代码将枚举catalog中的所有数据,并将Catalog删除,代码如下:
 
while (iter.hasNext())
{
        Object catalog = iter.next();
        dom4jSession.delete("Catalog", catalog);
     }
 
    最后需要将Session保存,并关闭Session,代码如下:

session.flush();
tx.commit();
session.close();
0
相关文章