Hibernate作为数据持久层的分析和研究

数据

  摘要 在Java技术中有许多方法可以对数据进行持久化,持久层也是Java应用程序中最重要的部分之一。本文在分析了3种持久层主流解决方案的基础上,介绍了O-R映射开源项目Hibernate,并介绍了在Web应用开发中怎样配置Hibernate的环境,并使用它建立一个应用。

  关键字 hibernate,数据持久化,JDBC, EJB,JDO

  数据持久层简介

  J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastructure),这样的划分非常经典,但是在实际的项目开发法中,开发者通常对三层结构进行扩展来满足一些项目的具体要求,一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation),控制/中介层(Controller/Mediator)、领域层(Domain),数据持久层(Data Persistence)和数据源层(Data Source)。它其实是在三层架构中增加了两个中间层。控制/中介层位于表示层和领域层之间,数据持久层位于领域层和基础架构层之间。由于对象范例和关系范例这两大领域之间存在“阻抗不匹配”,所以把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案,尽最大可能弥补这两种范例之间的差异。

  三种持久层主流解决方案

  1、JDBC

  许多开发者用JDBC进行数据库程序的开发。此中方式很多情况下都使用DAO模式,采用SQL进行查询。虽然用此方式可以使应用程序代码与具体的数据库厂商和数据库位置无关,不过JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序的DAO中书写这样的代码,维护量是非常大的。

  2、EJB

  在J2EE的规范中,为EJB定义了两种持久化的解决方案:一种是BMP,另一种是CMP。其中CMP不需要将SQL语句加入到代码中。目前,在采用J2EE的应用中,EJB CMP方式得到了广泛应用。更加引人注意的是,随着EJB规范的发展,CMP也包含了一些高级关系的内容。但是,CMP的使用比较复杂,对很多开发人员来说比较难以掌握。而且,不是在所有的情况下都适合在系统中采用EJB,而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。此外,许多情况下商用容器的性能和支持也不是很好。

  3、JDO

  JDO是一个存储java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。

  数据持久层新的解决方案Hibernate

  1、Hibernate介绍

  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库, Hibernate可以大大减少操作数据库的工作量。 另外Hibernate可以利用代理模式来简化载入类的过程,这将大大减少利用Hibernate QL从数据库提取数据的代码的编写量,从而节约开发时间和开发成本Hibernate可以和多种Web服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。

  2、Hibernate原理

  Hibernate技术本质上是一个提供数据库服务的中间件。它的架构如图1所示:


图1

  图1显示了hibernate的工作原理,它是利用数据库以及其他一些配置文件如hibernate.properties,XML Mapping等来为应用程序提供数据持久化服务的。

  Hibernate具有很大的灵活性,但同时它的体系结构比较复杂,提供了好几种不同的运行方式。在轻型体系中,应用程序提供JDBC连接,并且自行管理事务,这种方式使用了Hibernate的一个最小子集;在全面解决体系中,对于应用程序来说,所有底层的JDBC/JTA API都被抽象了,Hibernate会替你照管所有的细节。

  使用Hibernate建立一个应用

  1、配置Hibernate

  在src 目录下创建名为hibernate.cfg.xml 的配置文件,并且将它的路径添加到应用的类路径中就可以完成Hibernate 的配置。该配置文件由Hibernate 用来连接到数据库、生成模式和获得其它特定数据库信息的属性组成。要将底层数据库内的变动反射到整个应用,只需要修改该文件内的属性值。该配置文件的内容如下:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>
<session-factory>
 <property name="hibernate.connection.driver_class">COM.ibm.db2.jdbc.app.DB2Driver</property>
 <property name="hibernate.connection.url">jdbc:db2:cipDB</property>
 <property name="hibernate.connection.username">admin</property>
 <property name="hibernate.connection.password">rubipass</property>
 <property name="dialect">cirrus.hibernate.sql.DB2Dialect</property>
 <mapping resource="com/ubipass/cip/data/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
  2、创建映射文档

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

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
 <class name="com.ubipass.cip.Event" table="EVENTS">
  <id name="id" column="uid" type="long">
   <generator class="increment"/>
  </id>
  <property name="date" column="event_date" type="timestamp"/>
  <property name="title" column="event_title" type="string"/>
 </class>
</hibernate-mapping>
  映射文档在应用启动时编译,它可为Hibernate 提供关于持久对象的相应类、它们的结构、它们应该映射到哪个数据库表格、以及如何映射的信息。Hibernate 也使用这些映射文档,分别利用内建设备SchemaExport和CodeGenerator来生成相应的数据库模式和stub Java类。

  3、生成用于持久对象的stub Java类

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

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

options mapping_files

  它为classpath、options、和mapping_files参数提供了恰当的值。下面是通过映射文档Event.hbm.xml生成的stub java 类的部分代码。
 
package com.ubipass.cip
public class Event {
 private String title;
 ……
 Event(){ }
 public Long getId() {
  return id;
 }
 private void setId(Long id) {
  this.id = id;
 }
 ……
}
  4、生成数据库模式

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

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

  此命令为classpath、options、和mapping_files 参数提供了恰当的值。图2显示了由映射文档生成的模式的外形。


图2
  5、初始化并运行Hibernate的代码

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

  ·在恰当的类中,初始化和组装想要的持久对象 ;

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

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

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

  下面的代码显示了如何对上述的步骤进行实现:

// 初始化持久对象

Event ev = new Event();
ev.setDate("1/4/2004")
ev.setTitle("Hibernate startup");
try {
 //开始Hibernate
 Configuration cfg = new Configuration().addClass(Event.class);
 SessionFactory sf = cfg.buildSessionFactory();
 //打开 Session
 Session sess = sf.openSession();
} catch (HibernateException e) {
 e.printStackTrace();
}

//保存 Product 并关闭 Session

Transaction t = sess.beginTransaction();
sess.save(ev);
t.commit();
sess.close();
  总结

  Hibernate是一个功能强大,可以有效地进行数据库数据到业务对象的O/R映射方案。Hibernate推动了基于普通Java对象模型,用于映射底层数据结构的持久对象的开发。通过将持久层的生成自动扩展到一个更大的范围,Hibernate 使开发人员专心实现业务逻辑而不用分心于繁琐的数据库方面的逻辑,同时提供了更加合理的模块划分的方法。

时间: 2024-10-01 23:18:38

Hibernate作为数据持久层的分析和研究的相关文章

在SCA Module中使用iBATIS框架实现数据持久层

在完成 SCA Module 建模后用 Java 对象进行实现时,采用 Hibernate 和采用 iBATIS 实现 SCA Module 的数据持久层,目的都是为 SDO 提供数据访问服务并加快 SCA 模块实现.前文已经讲过关于如何使用 Hibernate 实现 SCA Module 的数据持久层,本文将介绍 iBATIS 框架,比较 iBATIS 和 Hibernate 的异同,并以实例的方式介绍如何使用 iBATIS 实现 SCA Module 的数据持久层. iBATIS 是一种数据

SpringSide开发实战(四):打通数据持久层的任督二脉

在这里,将创建一个简化的用户管理模块,演示怎样利用SpringSide提供的数据持久层 的功能,包括怎样通过Hibernate的Annotation来配置多对一映射和多对多映射. 大家都知道,现在最流行用户管理模型的是RBAC,也就是基于角色的访问控制模型,在 这种模型中,可以划分多个层次,如用户-角色-资源.用户-角色-权限-资源.用户-角色- 角色组-权限-资源.用户-角色-角色组-权限-操作-资源等等,因此,想要创建一个完善而 复杂的用户管理模块,是相当具有难度的.在Web2.0时代,有一

ASP数据持久层抽象

数据持久层在所有的系统中都存在.对于小型或者中型的ASP应用,这一点往往不受重视.这篇文章试图改善这一现状,以一种简单的方式提供了简化调用ADO相关对象的方法.这种方法的思想可以延伸到其他编程语言,只要这种语言稍微具备一点点面向对象的思想,那么本篇文章将使你收益. 你还在使用ASP吗?我知道ASP虽然被很多高级的企业级应用抛弃,但是像我一样靠ASP起家的开发者,或者开发一些简单WEB应用的开发者,一定在某些时候还在考虑ASP.它简单,容易使用.在访问数据库方面,通过ADO也能够无所不能.然而使用

数据持久层 jdorm 1.1 ORM 框架

数据持久层jdorm1.1 orm框架 是基于jdbc 而成,性能高效.新增对enetity验证功能 文章转载自 开源中国社区 [http://www.oschina.net]

数据持久层 jdorm 1.1.1 orm 框架

数据持久层 jdorm1.1 orm 框架 是基于jdbc 而成的框架,jdorm 1.1.1 版本新增spring 类似支持的事务,扩展了编程式事务,性能超越ibatis. 文章转载自 开源中国社区 [http://www.oschina.net]

Hibernate 5.0.14 发布,数据持久层框架

Hibernate 5.0.14 发布了. Hibernate 是一种 Java 语言下的对象关系映射解决方案. 它是使用 GNU 宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate 也是目前 Java 开发中最为流行的数据库持久层框架,现已归 JBOSS 所有. 更新内容请参考提交记录. 下载地址 Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区[https

精通hibernate -java数据库持久层开发核心编程 黄佩虹

问题描述 雪地里跪求:精通hibernate-java数据库持久层开发核心编程黄佩虹中附光的盘资源邮箱:819948087@qq.com

Hibernate框架数据分页技术实例分析_java

本文实例讲述了Hibernate框架数据分页技术.分享给大家供大家参考,具体如下: 1.数据分页机制基本思想: (1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定. (2)获取记录总数,即获取要显示在页面中的总记录数,其目的是根据该数来确定总的分布数. (3)确定分页后的总页数.可根据公式:"总页数=(总记录数 - 1) / 每页显示的记录数 + 1". (4)根据当前页数显示数据.如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数. (5)通过For.

Hibernate ORM 5.1.7 发布,数据持久层框架

Hibernate ORM 5.1.7 最终版已发布,这可能是 5.1 系列的最后一个版本,建议提前迁移到 5.2 以备接收后续的 bug 修复. Hibernate ORM 5.1.7.Final: tag 请查看 此处 更新列表请点击 此处 发行包在 SourceForge 和 BinTray 下载地址: http://hibernate.org/orm/downloads/ 文章转载自 开源中国社区[https://www.oschina.net]