`

关于持久化的理解

 
阅读更多
在初步学习hibernat时,对持久化理解不清楚,在网上看到一篇文章,觉得不错。拿来分享。
何谓“持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

何谓“持久层”
持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

何谓“对象数据映射(ORM)”
ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。

备注:建模领域中的 ORM 为 Object/Role Modeling(对象角色建模)。另外这里是“O/R Mapper”而非“O/R Mapping”。相对来讲,O/R Mapping 描述的是一种设计思想或者实现机制,而 O/R Mapper指以O/R原理设计的持久化框架(Framework),包括 O/R机制还有 SQL自生成,事务处理,Cache管理等。



以前本坛有位道友专门写了一篇持久层的文章,还有图片,可惜图片现在不在了。

“持久化”这个概念是和“暂时”等概念相对的,数据在计算机中有一般有两个存储地,内存为暂存,因为电源关机就会数据丢失,如果需要反复使用,就要持久保存,实现持久化了。

持久化现在有多个途径,如数据库和文件等。

持久层是J2EE中实现持久化的一个层次,由于它和数据库等具体技术打交道,而且不同数据库提供的接口不一致,因此,有4个指标来衡量持久化技术的选择:

1. 性能 --> 高性能,最好能直接使用具体数据库特性

2. 通用 --> 可移植,在不同数据库之间移植
3. 方便 --> 使用方便,o/R mapping非常方便
4. 安全 --> 事务机制好,很好地支持CAID等。



数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称.
数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。
cmp和Hibernate只是对象模型到关系模型之间转换的不同实现。只不过对象模型和关系模型应用广泛,所以就会误认为数据持久化就是对象模型到关系型数据库的转换罢了。


除了 ORM 技术,还有以下几种持久化技术

主动域对象模式
它是在实现中封装了关系数据模型和数据访问细节的一种形式。在 J2EE 架构中,EJB 组件分为会话 EJB 和实体 EJB。会话 EJB 通常实现业务逻辑,而实体 EJB 表示业务实体。实体 EJB 又分为两种:由 EJB 本身管理持久化,即 BMP(Bean-Managed Persistence);有 EJB 容器管理持久化,即 CMP(Container-Managed Persistence)。BM P就是主动域对象模式的一个例子,BMP 表示由实体 EJB 自身管理数据访问细节。
主动域对象本身位于业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层应用结构,并没有从业务逻辑层分离出独立的持久化层。

JDO 模式
Java Data Objects(JDO)是 SUN 公司制定的描述对象持久化语义的标准API。严格的说,JDO 并不是对象-关系映射接口,因为它支持把对象持久化到任意一种存储系统中,包括 关系数据库、面向对象的数据库、基于 XML 的数据库,以及其他专有存储系统。由于关系数据库是目前最流行的存储系统,许多 JDO 的实现都包含了对象-关系映射服务。

CMP 模式
在 J2EE 架构中,CMP(Container-Managed Persistence)表示由 EJB 容器来管理实体 EJB 的持久化,EJB 容器封装了对象-关系的映射及数据访问细节。CMP 和 ORM 的相似之处在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑中分离出来。区别在于 CMP 负责持久化实体 EJB 组件,而 ORM 负责持久化 POJO,它是普通的基于 Java Bean 形式的实体域对象。

一般把基于 Java Bean 形式的实体域对象称为 POJO(Plain Old Java Object),意为又普通又古老的 Java 对象的意思。随着各种 ORM 映射工具的日趋成熟和流行,POJO有重现光彩,它和基于 CMP 的实体 EJB 相比,即简单又具有很高的可移植性,因此联合使用 ORM 映射工具和 POJO,已经成为一种越来越受欢迎的且用来取代 CMP 的持久化方案。POJO 的缺点就是无法做远程调用,不支持分布式计算。


为什么要做持久化和ORM设计

在目前的企业应用系统设计中,MVC,即 Model(模型)- View(视图)- Control(控制)为主要的系统架构模式。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。

简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。
一般基本都是如下几个步骤:
1、建立数据库连接,获得 Connection 对象。
2、根据用户的输入组装查询 SQL 语句。
3、根据 SQL 语句建立 Statement 对象 或者 PreparedStatement 对象。
4、用 Connection 对象执行 SQL语句,获得结果集 ResultSet 对象。
5、然后一条一条读取结果集 ResultSet 对象中的数据。
6、根据读取到的数据,按特定的业务逻辑进行计算。
7、根据计算得到的结果再组装更新 SQL 语句。
8、再使用 Connection 对象执行更新 SQL 语句,以更新数据库中的数据。
7、最后依次关闭各个 Statement 对象和 Connection 对象。

由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。而一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。另一方面,假如要换数据库产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。
所以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。所以为解决这一困难,就出现 ORM 这一个对象和数据之间映射技术。

举例来说,比如要完成一个购物打折促销的程序,用 ORM 思想将如下实现(引自《深入浅出Hibernate》):
业务逻辑如下:
public Double calcAmount(String customerid, double amount)
{
    // 根据客户ID获得客户记录
    Customer customer = CustomerManager.getCustomer(custmerid);
    // 根据客户等级获得打折规则
    Promotion promotion = PromotionManager.getPromotion(customer.getLevel());
    // 累积客户总消费额,并保存累计结果
    customer.setSumAmount(customer.getSumAmount().add(amount);
    CustomerManager.save(customer);
    // 返回打折后的金额
    return amount.multiply(protomtion.getRatio());
}
这样代码就非常清晰了,而且与数据存取逻辑完全分离。设计业务逻辑代码的时候完全不需要考虑数据库JDBC的那些千篇一律的操作,而将它交给 CustomerManager 和 PromotionManager 两个类去完成。这就是一个简单的 ORM 设计,实际的 ORM 实现框架比这个要复杂的多。


目前有哪些流行的 ORM 产品
目前众多厂商和开源社区都提供了持久层框架的实现,常见的有
Apache OJB (http://db.apache.org/ojb/)
Cayenne (http://objectstyle.org/cayenne/)
Jaxor (http://jaxor.sourceforge.net/)
Hibernate (http://www.hibernate.org/)
iBatis (http://www.ibatis.com/)
jRelationalFramework (http://ijf.sourceforge.net/)
mirage (http://itor.cq2.org/en/oss/mirage/toon)
SMYLE (http://www.drjava.de/smyle)
TopLink (http://otn.oracle.com/products/ias/toplink/index.html)
其中 TopLink 是 Oracle 的商业产品,其他均为开源项目。

其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准,这也是开源项目影响工业领域标准的有力见证。

[color=darkblue][/color]


参考文献:1、《深入浅出Hibernate》
         2、《精通Hibernate:Java对象持久化技术详解》

绿色通道: 好文要顶 关注我 收藏该文与我联系 
ymingkm
关注 - 6
粉丝 - 8 +加关注 0 0 (请您对文章做出评价) « 博主前一篇:VS 2008 下面开发Serverlight 程序的配置 (转载)
» 博主后一篇:C#中的"序列化" Serializable 理解

posted @ 2010-07-07 09:02 ymingkm 阅读(900) 评论(0) 编辑 收藏
分享到:
评论

相关推荐

    深入理解持久化对象

    ### 深入理解持久化对象 #### Hibernate与持久化对象 Hibernate作为一款优秀的Java持久层框架,其设计理念强调低侵入性,这意味着在开发过程中,可以使用标准的Java对象(POJO)进行编程,无需让POJO继承特定的...

    ios 数据持久化存储

    在iOS开发中,数据持久化是至关重要的,它允许应用程序在用户关闭应用或者设备重启后仍然保留数据。本文将深入探讨iOS中的几种主要数据持久化技术:Preference(偏好设置)、文件存储、归档、数据库(SQLite)以及...

    消息和主题(持久化-非持久化)分类--持久化订阅

    标题中的“消息和主题(持久化-非持久化)分类--持久化订阅”指的是在分布式消息传递系统中,特别是基于发布/订阅模型的系统中,关于消息存储和处理的两种不同策略:持久化和非持久化订阅。在这个场景下,我们将深入...

    域对象在持久化层的状态

    在软件开发中,特别是涉及数据库操作的应用场景下,理解和掌握域对象在持久化层的状态对于优化系统性能和维护数据一致性至关重要。本文将围绕“域对象在持久化层的状态”这一主题,深入探讨其核心概念、作用机制以及...

    WF 4.0 之持久化操作

    在工作流(WF)领域,特别是针对WF 4.0版本的理解中,“WF 4.0 之持久化操作”这一主题聚焦于如何有效地将工作流的状态保存下来,以便在后续的操作中能够继续执行。持久化操作对于构建健壮的工作流应用至关重要,...

    自己写的一个持久化层

    这个自定义实现可能是为了学习目的,以便理解持久化机制的工作原理,或者是为了满足特定项目的需求,而无法直接使用Hibernate等现成框架。 描述中提到“模仿Hibernate的操作”,暗示了这个持久化层可能包含了类似的...

    quartz的持久化

    总的来说,理解并正确配置 Quartz 的持久化机制对于确保定时任务的可靠性和可维护性至关重要。开发者需要根据项目需求和现有的数据存储方案选择合适的 JobStore 实现,并确保正确地执行相关的初始化和维护操作。

    activeMQ mysql 持久化

    通过分析这些代码,你可以更深入地理解ActiveMQ如何与MySQL交互,以及如何在Java应用中实现消息的持久化。这将帮助你构建更加健壮和可靠的消息传递系统,特别是在需要保证数据完整性和一致性的情况下。

    Hibernate 操纵持久化对象

    本篇将详细讲解如何使用Hibernate来操纵持久化对象,这对于深入理解Hibernate的核心概念至关重要。 **一、Hibernate概述** Hibernate是一个开源的ORM框架,它的主要作用是将Java对象与数据库表进行映射,从而避免了...

    持久层和持久化

    在Java开发中,持久层和持久化是两个关键的概念,它们是对象与数据库交互的核心。本文将探讨iBATIS、Hibernate以及Java Persistence API (JPA)这三种流行的持久化框架,并进行对比分析。 首先,持久层(Persistence...

    Hibernate数据持久化技术

    数据持久化技术是软件开发中一个关键的概念,它旨在解决对象型编程语言(如Java)与关系型数据库之间数据交互的挑战。通过持久化,我们可以将应用程序中的对象状态保存到数据库中,以便在后续的使用中能恢复这些状态...

    Quartz持久化资料大全

    在Quartz 2.1.7版本中,持久化功能被强化,以确保任务在系统重启后仍能继续执行,同时兼容了后续的2.2.0版本。在实际应用中,Quartz的持久化经常与Spring框架结合,通过Spring的数据源(dataSource)来实现任务的...

    解密Redis持久化

    首先,理解数据持久化的概念至关重要。简单来说,持久化就是将内存中的数据保存到非易失性存储设备,如硬盘,以便在系统重启后仍能访问这些数据。在数据库系统中,写操作通常包括以下步骤: 1. 客户端发起写请求,...

    Hibernate自动生成持久化类和映射文件

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它能够将数据库中的数据与Java对象进行映射,从而简化数据库操作。"Hibernate自动生成持久化类和映射文件"这个话题主要涉及如何利用...

    可持久化数据结构

    ### 可持久化数据结构详解 #### 一、概述与定义 **可持久化数据结构**是一种特殊的数据结构设计方式,允许在不破坏原有数据结构的基础上进行修改,并且能够高效地查询任意历史版本的状态。这类数据结构对于处理具有...

    Android数据持久化

    在Android应用开发中,数据持久化是至关重要的一个环节,它允许应用程序在用户退出或设备重启后仍能保存和恢复数据。以下将详细介绍Android...理解并熟练运用这些数据持久化机制,是构建健壮、高效Android应用的基础。

    Java对象持久化技术概述

    ### Java对象持久化技术概述 #### 一、Java对象持久化技术概览 Java对象持久化技术是指将Java对象的状态保存到外部存储介质的过程。这种技术对于任何基于Java的应用程序都至关重要,因为它允许应用程序在断电或...

    可持久化数据结构研究

    1. 基本概念:理解可持久化的定义,以及可持久化数据结构与传统数据结构的主要区别。 2. 线段树(Segment Tree):线段树是一种常见的数据结构,用于解决区间查询和修改的问题。可持久化线段树是可持久化数据结构中...

    持久化工作流示例

    在IT行业中,工作流(Workflow)是一种用于自动化业务流程的技术,它可以模拟并管理人们、系统和应用程序之间的交互...这个示例是学习WF持久化功能的一个很好的起点,它将帮助你理解和应用WF在实际项目中的持久化策略。

    序列化与持久化相同点跟不同点

    ### 序列化与持久化的相同点与不同点 #### 一、持久化定义与应用场景 **持久化**是指将程序中的数据(如内存中的对象)保存到可长期存储的设备上,比如硬盘或者固态硬盘等。持久化的主要目的是确保即使在程序结束...

Global site tag (gtag.js) - Google Analytics