摘要 在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 使开发人员专心实现业务逻辑而不用分心于繁琐的数据库方面的逻辑,同时提供了更加合理的模块划分的方法。
分享到:
相关推荐
### 基于Hibernate的数据持久层关键技术的研究 #### 一、引言 随着软件开发的不断进步和技术的发展,越来越多的企业级应用需要高效地管理和访问大量数据。为了更好地满足这一需求,许多开发团队选择了使用ORM...
《基于Hibernate框架的数据持久层的研究及其应用》 ...在图书管理系统的案例中,我们展示了如何构建基于Hibernate的数据持久层,并对其优缺点进行了分析,这为其他类似项目的开发提供了有益的参考和建议。
1. **数据持久层的实现**:在数据持久层,需要使用Hibernate框架来创建数据访问对象(DAO)。首先定义实体类(Entity Class),例如管理员(Admin)实体类,并使用注解或XML配置文件来映射实体类和数据库表之间的...
在现代企业级应用开发中,数据持久化是一项核心需求,而使用Hibernate和Spring构建事务持久层成为了许多开发者的选择。Hibernate,作为一款强大的对象关系映射(ORM)框架,简化了Java应用程序与数据库之间的交互,...
《深入理解Hibernate数据持久层框架 v5.4.21》 Hibernate,作为一个开源的Java对象关系映射(ORM)框架,是Java开发者在处理数据库操作时的强大工具。它的核心功能在于将Java类与数据库表进行映射,使得开发者可以...
通过上述分析可以看出,基于Hibernate的数据持久层解决方案在实际项目开发中具有明显的优势。然而,任何技术都有其适用范围和局限性,因此,在使用Hibernate进行数据持久化时应注意以下几点: - **深入理解...
通过对Hibernate性能优化的研究,我们不仅可以深入了解其工作原理,还能掌握如何有效地提高数据持久层的性能。通过合理的配置和策略调整,可以在很大程度上缓解性能瓶颈问题,从而构建出更为高效稳定的企业级应用。
这个项目是一个使用Java编程语言,结合Struts框架和Hibernate持久层技术开发的人力资源管理系统。这个系统充分展示了Java在企业级应用中的实力,以及Struts和Hibernate在构建Web应用程序时的高效性和灵活性。 ...
- **持久层**:为企业级应用提供了一个抽象层,便于管理与数据库的交互。 ##### 1.3 依赖注入框架Spring Spring是一个轻量级的Java应用框架,提供了以下关键特性: - **依赖注入**(Dependency Injection, DI):...
Hibernate 是一个面向对象的持久层框架,它提供了 ORM (Object Relational Mapping) 功能,可以将 Java 对象映射到数据库表,并且支持 SQL 查询和数据库结果集的转换。Hibernate 的主要特性包括: - **对象关系映射...
Hibernate作为ORM框架的核心任务是消除Java对象与数据库表之间的鸿沟。它通过XML或注解定义映射规则,使得开发者可以使用面向对象的方式来操作数据库。在源代码中,`org.hibernate.cfg.Configuration`类是配置的...
Hibernate作为数据访问层,负责与数据库交互;Spring作为业务逻辑层,管理对象生命周期和事务处理。 #### 四、架构优缺点分析 **优点**: 1. **松耦合**:各个层之间通过接口通信,降低了层间的依赖程度。 2. **易...
想的应用最为广泛的持久层框架技术。通过 Hibernate 使开发人员可以使用面向 对象的思想来操作关系型数据库的各类数据,同时 Hibernate 还提供了灵活的事 务处理和查询机制。通过以上两个框架的整合应用,可以形成一...
- **持久层**:专门处理数据访问操作,包括数据的存储和检索。 - **数据库层**:存储实际的数据。 这种分层架构使得开发者能够更加模块化地设计和开发Web应用,提高代码的复用性和维护性。 ##### 2.2 当前J2EE框架...
【描述】:该研究探讨了Hibernate技术如何在综合网络管理系统(INM)中被应用,强调了Hibernate作为一种持久层框架,如何通过对象关系映射(ORM)提高数据访问的效率和灵活性。 【标签】:“人工智能”、“大数据”...
Spring4作为整体的容器管理SpringMVC和Hibernate,SpringMVC处理Web层的请求,而Hibernate负责数据持久化。Spring4通过AOP可以在合适的时候调用Hibernate进行数据库操作,无需在业务代码中显式进行。这种集成方式...
1. **数据持久化**:**Hibernate**作为一种优秀的数据持久化工具,可以显著提高数据访问层的开发效率。通过使用**Hibernate**,可以减少大量的SQL代码编写工作,使开发者能够更加专注于业务逻辑的实现。 2. **降低...
Hibernate作为Java ORM的领军者,其源码深入分析可以帮助我们理解数据持久化层的设计原理,对于Java后端开发者来说,是提升技术水平的重要参考资料。 【描述】提到的“官网下载”表明这些源码来源于Hibernate的官方...
其次,Hibernate作为数据访问层,是一个强大的对象关系映射(ORM)框架。它简化了与数据库的交互,通过映射XML文件将Java对象与数据库表进行绑定,实现了对数据库的操作。在仓库管理系统的上下文中,Hibernate可以...