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(); |
下面的代码将获得文档对象中catalog节点的列表,并且创建一个iterator对象用于浏览列表中止数据:
| list list = document.selectnodes("//catalog"); iterator iter = list.iterator(); |
iterate可以枚举列表中的对象,并且从列表中获得相应的节点。我们可以使用save(string entityname,object object)方法来将节点数据保存在数据库中。其实save方法并不会真的将数据保存在数据库中,要想物理保存,必须使用flush方法来同步数据库和xml文档,代码如下:
| while(iter.hasnext()) |
最后,我们将使用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++) |
下面的代码使用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()) |
最后需要将session保存,并关闭session,代码如下:
| session.flush(); tx.commit(); session.close(); |
闽公网安备 35060202000074号