服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用hibernate3.1实现xml和数据库的同步

    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所示:

    这个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();
用hibernate3.1实现xml和数据库的同步(图一)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())
用hibernate3.1实现xml和数据库的同步(图二)用hibernate3.1实现xml和数据库的同步(图三)...{
用hibernate3.1实现xml和数据库的同步(图四)    object catalog = iter.next();
用hibernate3.1实现xml和数据库的同步(图四)    dom4jsession.save("catalog", catalog);
用hibernate3.1实现xml和数据库的同步(图五)}

    最后,我们将使用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();

扫描关注微信公众号