使用Hibernate 的O/R 映射(转)

目录
1.持久层:问题和解决方案
2.安装Hibernate
3.配置Hibernate
4.使用Hibernate建立一个应用
5.结论

大部分企业应用不得不与他们的后端数据库频繁交互。为了让这种交互成为可能,并且使得交互变得有效而迅捷,企业应用开发者在应用和底下的数据库之间创建了一个“持久层”(persistence layer)。这个数据库负责存储从应用到数据库的数据,也负责数据的检索、更新和删除。在基于J2EE的企业应用中,组成这个持久层的Java类既可以映射对象到数据,也可以映射数据到对象。这个持久层使用JDBC、实体beans 、JDO等等之类的工具通常都可以建立。

1.持久层:问题和解决方案

建立一个持久层是简单的,只要在Java对象和相应的数据库之间存在线性关系(例如:一个对象域映射到相应的数据库表格的某一列)。但是这种关系常常难于建立,因为对象或者下层的数据库结构复杂(例如,对象具有混合的类型、集合、和属性;数据库表格有外部钥匙约束、串联属性)

经常,在开发持久层的时候,后端数据库的属性和它的模式假设永远保持不变。基于这种假设,所有的持久性操作在应用中是硬编码的,因此只能绑定到一种特殊的数据库模式中。当后端的数据库模式任何时候发生改变(这在现实生活中经常发生),这种方法极耗时间和精力。数据库模式的改变导致了整个持久层必须重写,应用程序代码本身也有可能要进行大量的修改。这是一个单调乏味、非常费时的任务。

而且,这些持久层常有可能发生故障,效率低下。

这就是Hibernate 最拿手的地方。Hibernate 是一个开源对象/与持久性和查询相关的框架。目前在版本2.1.1中, Hibernate 是一个ODMG3 interface ,只要有Lesser GNU Public License (LGPL)就可以从hibernate.org 处免费下载。

ODMG3 是由对象数据管理小组(ODMG)开发的规范,ODMG 是一个由不同的投资商和兴趣小组为开发用于对象数据库和对象相关的映射产品的可移植性规范而结成的联盟。该规范推动了在不止一个产品上运行的可移植应用程序的开发。要了解更多信息请看链接.

Hibernate 帮助基于普通的Java对象模型的持久对象的创建,从而允许持久对象拥有复杂的结构如混合类型、集合和属性,还可以拥有用户自定义的类型。现在这些持久对象可以有效的反映出底层数据库模式的复杂结构。Hibernate 依赖于“运行期反射”。

“运行期反射”在运行期收集关于对象和它们相应的数据库映射的信息,这就废除了持久层内对象数据库映射的硬编码。这样,Hibernate使得持久层以持久层代码的最小修改就能够适应底层数据库模式的任何未知变化。反射是核心Java的一个特征,它促使Java代码发现关于所装载的类的域、方法和构造器。反射允许使用反射的域、方法和构造器,在安全限制内,运行对象上的底层配对物。要了解更多信息请看链接。

Hibernate 自动将持久层扩展到更大的范围,使用它内建的设备CodeGenerator SchemaExport 就可以完成,从而大大的降低了硬编码的故障率。Hibernate 也提供了易于使用的Hibernate Query Language (HQL),它是作为“到SQL的最小化面向对象扩展”而设计的一种丰富的查询语言。HQL 推动了数据库类型独立查询的编写,数据库类型独立查询在运行期内可以转换成底层数据库的本地SQL方言。该方法保证了底层数据库类型改变时(如从Oracle 变为PostgreSQL )代码中的查询不受影响。

为了提高效率,Hibernate包括了一些策略,如与数据库交互时的多重最优化,包括对象的缓存、有效外部连接的获取、必要时SQL语句的执行。Hibernate的过程开销比JDBC少10%。

2.安装Hibernate

· 从SourceForge处下载Hibernate源代码的最新版本(如文件hibernate-2.1.1.zip或者hibernate-2.1.1.tar.gz)。 而且,请看hibernate.org 上的Download Overview 以备参考。

· 解压源代码文件,将内容释放到想要的目录下(最好是application development directory)。现在,给定的目录将包含Hibernate自己的JAR 库hibernate2.jar,以及包括两个重要目录libsrc 的其他目录。lib 目录包含用于代码生成、ODMG、dom4j、日志等等的第三组织的库。src 目录包含持久层的源文件。

· 添加hibernate2.jar 和其他JAR 库的相应路径到lib 目录下,对于应用程序的开发来说,到达应用的类路径是有必要的。

· 定位用于将要使用的数据库(如用于DB2 UDB的db2java.zip)的JDBC 驱动,添加他的路径到全局类路径。

现在,Hibernate已经为开发给定应用的持久层做好准备。下面部分探索了完成该任务的必要步骤。

3.配置Hibernate

在src 目录下创建名为hibernate.properties 的属性文件,并且将它的路径添加到应用的类路径中就可以完成Hibernate 的配置。该属性文件由Hibernate 用来连接到数据库、生成模式和获得其它特定数据库信息的属性组成。要将底层数据库内的变动反射到整个应用,只需要修改该文件内的属性值。Listing 1 给出了一个简单的例子,这些属性中的大部分属性都是可以自我说明的。

注意: 现在Hibernate也可以使用存在于src 目录下,名为hibernate.cfg.xml 的简单XML文件来配置。该文件的结构与hibernate.properties 非常类似,并且具有相同的功能。Listing 2给出了一个例子。

4.使用Hibernate建立一个应用

现在,我们开始建立应用。其步骤如下:

· 创建映射文档

· 生成用于持久对象的stubJava类

· 生成数据库模式

· 准备用来初始化和在恰当位置上运行Hibernate 的代码

下面将为你一一详解这些步骤。

创建映射文档

映射文档是用来定义持久数据和需要时保存关于对象的持久域、关联、子类和代理的XML文档。对于每个持久对象和以名字class_name.hbm.xml保存的文件来说,都要创建一个映射文档。在class_name.hbm.xmlclass_name就是对象的类名。Listing 3给出了一个映射文档Event.hbm.xml。

映射文档在应用启动时编译,它可为Hibernate 提供关于持久对象的相应类、它们的结构、它们应该映射到哪个数据库表格、以及如何映射的信息。Hibernate 也使用这些映射文档,分别利用内建设备SchemaExportCodeGenerator来生成相应的数据库模式和stubJava类。

生成stub类

在创建了映射文档之后这个任务就变得简单的多。stub类的创建使用Hibernate的内建设备 CodeGenerator ,执行一个简单的命令就可以完成。,命令的语法如下:

java -cp classpath net.sf.hibernate.tool.hbm2java.CodeGenerator
         options mapping_files

它为classpath、options、mapping_files参数提供了恰当的值。Listing 4显示了使用Listing 3中给出的映射文档生成的stub文件。

生成数据库模式

要使用Hibernate的 SchemaExport 来生成数据库模式,在提交了用于参数的恰当值之后执行下列命令:

java -cp classpath net.sf.hibernate.tool.hbm2ddl.SchemaExport
         options mapping_files

他为classpath、options、mapping_files 参数提供了恰当的值。下图显示了使用Listing 3中给出的映射文档而生成的模式。

273674.gif

Figure 1: 使用Listing 3中给出的映射文档而生成的模式的外形

初始化和运行Hibernate

要初始化和运行hibernate,需要采取以下步骤:

· 在恰当的类中,例示和组装想要的持久对象

· 在应用启动时使用net.sf.hibernate.cfg.Configuration 对象获取net.sf.hibernate.SessionFactory 对象

· 调用SessionFactory 对象上的openSession() 方法来打开net.sf.hibernate.Session

· 保存想要的对象,关闭Session.

Listing 5显示了如何使用一个简单的类来实现上述步骤。现在,应用已经是完整的,在执行时,可以保存想要的对象到底层数据库中,目的是为了让他们具有持久性。

5.结论

Hibernate是一个功能强大、高性能、特征丰富,非常流行的用于 Java 的ORM 方案。Hibernate推动了基于普通Java对象模型,用于映射底层数据结构的持久对象的开发。 除了映射对想到数据库之外,Hibernate也可以提供高级数据查询和检索服务,通过HQL、有效缓存、和其它优化技巧以及用于代码和模式生成的有用的内建设备可以完成这些任务。

通过将持久层的生成自动扩展到一个更大的范围,Hibernate 可帮助减轻开发者可达95%的普通的与持久性相关的编码工作。

关于作者

Mugdha Chauhan (正式名Mugdha Vairagade) 是一名资深的IT顾问和作家。作为一个开源支持者,她频繁写作关于有用的新兴开源项目的文章和指南。主要的技术媒体包括developer.com、 IBM developerWorks、 CNET Networks、 Slashdot在内,以及许多的电子杂志都定期的发表它的作品。他擅长和感兴趣的方面包括: Java、 Linux、 XML、 无线应用开发和开源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章