欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

转:Java对象持久化技术概述

程序员文章站 2022-07-12 18:26:57
...
Java对象持久化技术概述
Hibernate从不同的角度的不同解释:
它是连接Java应用程序和关系数据库的中间件
它对JDBC API进行了封装,负责Java对象的持久化
在分层的软件架构中,它位于持久化层,封装了所有数据访问细节,使业务逻辑层可以专注于实现业务逻辑
它是一种ORM映射工具,能够建立面向对象的域模型和关系数据模型之间的映射
1、应用程序的分层体系结构
三层结构是目前典型的一种应用软件的结构:表述层、业务逻辑层、数据库层
1.1、区分物理层和逻辑层
软件的分层包含两层含义:一种是物理分层,即每一层都运行在单独的机器上,这意味着创建分布式的软件系统;一种是逻辑分层,指的是在单个软件模块中完成特定的功能。
1.2、软件层的特征
每个层由一组相关的类或组件构成,共同完成特定的功能
层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的API,而下层组件不应该依赖上层组件
每个层对上层公开API,但具体的实现细节对外透明。
1.3、Java应用的持久化层
在三层软件结构中,业务逻辑层不仅负责业务逻辑,而且直接访问数据库,提供对业务数据的保存、更新、删除和查询操作。为了把数据访问细节(指的是应用程序代码中生成恰当的SQL语句,然后通过JDBC API访问数据库,对数据进行保存、更新、删除或查询操作)和业务逻辑分开,可以把数据访问作为单独的持久化层
目前在持久化层领域,已经出现了许多优秀的ORM(对象——关系映射)软件,Hibernate就是一种越来越受欢迎的开发源代码的ORM软件。ORM软件具有中间件的特性,中间件是在应用程序和系统之间的连接管道,Hibernate可以看成是连接Java应用和关系数据库的管道
Hibernate作为中间件,可以为任何一个需要访问数据库的Java应用服务,显示了Hibernate的通用性,中间件的另一个特点是透明性,作为Hibernate的使用者,无需关心它是如何实现的,只需知道如何访问它的接口就行了
2、软件的模型
在软件开发领域,模型用来表示真实世界的实体。在软件开发的不同阶段,需要为目标系统创建不同类型的模型。在分析阶段,需要创建概念模型。在设计阶段,需要创建 数据模型和域模型
2.1、概念模型
在建立模型之前,首先要对问题域进行详细的分析,确定用例,接下来就可以根据用例来创建概念模型。概念模型用来模拟问题域中的真实实体。概念模型描述了每个实体的概念和属性,以及实体之间的关系,并不描述实体的行为
创建概念模型的目的是帮助更好的理解问题域,识别系统中的实体,这些实体在设计阶段很有可能变为类。
2.2、关系数据模型
到目前为止,关系数据库仍然是使用最广泛的数据库,它存储的是关系数据。
关系数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构,它由以下内容组成:
一个或多个表
表的所有索引
视图
触发器
表与表之间的参照完整性
通常,一个实体对应一个表,表通过主键来保证每条记录的惟一性,表的主键应当不具有任何业务含义,因为任何有业务含义的列都有改变的可能性。关系数据库学的最重要的一个理论就是:不要给关键字赋以任何业务含义。
为了使表的主键不具有任何业务含义,一种解决方法是使用代理主键,例如为表定义一个不具有任何业务含义的ID字段,专门作为表的主键
对于实体和实体之间的关系,可以通过表与表之间的参照完整性来实现
2.3、域模型(面向对象)
概念模型是在软件分析阶段创建的,它帮助开发人员对应用的需求获得清晰准确的理解,在软件设计阶段,需要在概念模型的基础上创建域模型,域模型是面向对象的。
域模型由域对象和域对象之间的关系组成
2.3.1、域对象
构成域模型的基本元素就是域对象。域对象,是对真实世界的实体的软件抽象,域对象还可以叫做业务对象,域对象可以代表业务领域中的人、地点、事务或概念
域对象分为:实体域对象、过程域对象、事件域对象
实体域对象:实体域对象可以代表人、地点、事物或概念。为了使实体域对象与关系数据库中的记录对应,可以为每个实体域对象分配惟一的OID,OID是关系数据库中的主键在实体域对象中的等价物
过程域对象:过程域对象代表应用中的业务逻辑或流程
事件域对象:事件域对象代表应用中的一些事件(如异常、警告或超时),这些事件通常由系统中某种行为触发
在三层应用结构中,以上三种域对象都位于业务逻辑层,实体域对象是应用的业务数据在内存中的表现形式,而过程域对象用于执行业务逻辑
2.3.2、域对象之间的关系
在域模型中,类之间存在四种关系
1、关联
关联指的是类之间的引用关系,这是实体域对象之间最普遍的一种关系。关联可分为一对一,一对多和多对多关联。如果类A和类B关联,那么被引用的类B将定义为类A的属性
2、依赖
依赖指的是类之间的访问关系。如果类A访问类B的属性或方法,或者类A负责实例化类B,那么可以说类A依赖于类B。和关联关系不同,无需把类B定义为类A的属性。依赖关系在实体域对象之间不常见,但是过程域对象往往依赖实体域对象,因为过程域对象会创建实体域对象,或者访问实体域对象的属性及方法。
3、聚集
聚集指的是整体与部分之间的关系,在实体域对象之间也很常见
聚集关系和关联关系在类的定义上有相同的形式,不过两者有不同的语义,对于聚集关系,部分类的对象不能单独存在,他的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。对于存在关联关系的两个类,可以允许每个类的对象都单独存在
4、泛化(Generalization
泛化指的是类之间的继承关系
3、域对象的持久化概念
当实体域对象在内存中创建后,它们不可能永远存在。最后,他们要么在内存中清除,要么被持久化到数据库中。内存无法永久的保存数据,因此必须对实体域对象进行持久化
并不是所有的域对象都需要持久化,通常只有实体域对象才需要持久化,另外有些实体域对象也不需要进行持久化
狭义的理解,“持久化”仅仅指把域对象永久保存到数据库中,广义的理解,“持久化”包括和数据库相关的各种操作
保存:把域对象永久的保存到数据库中
更新:更新数据库中域对象的状态
删除:从数据库中删除一个域对象
查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库中加载到内存中
加载:根据特定的OID,把一个域对象加载到内存中
3.1、直接通过JDBC API来持久化实体域对象
实体域对象的持久化最终必须通过数据访问代码来实现。Java应用访问数据库的最直接的方式就是直接访问JDBC API。Java.sql包提供了JDBC API,程序员可以通过它编写访问数据库的程序代码。在java.sql包中常用的接口和类包括以下内容
DriverManager:驱动程序管理器,负责创建数据库连接
Connection:代表数据库连接
Statement:负责执行SQL语句
PreparedStatement:负责执行SQL语句,具有预定义SQL语句的功能
ResultSet:代表SQL查询语句的查询结果集
3.2、ORM简介
对象关系映射模式指的是在单个组件中负责所有实体域对象的持久化,封装数据访问细节。ORM采用元数据来描述对象——关系的映射细节,使得ORM中间件能在任何一个Java应用的业务逻辑层和数据库层之间充当桥梁
3.2.1、对象——关系映射的概念
ORM解决的主要问题就是对象——关系的映射。域模型和关系模型都分别建立在概念模型的基础上。域模型是面向对象的,而关系数据模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录
但是域模型与关系模型之间存在许多不匹配之处,ORM中间件需要采用各种映射方案,来建立两种模型之间的映射关系
3.2.2、ORM中间件的基本使用方法
ORM中间件采用元数据来描述对象——关系映射细节,元数据通过采用XML格式,且存放在专门的对象——关系映射文件中。如果希望把ORM软件集成到自己的Java应用中,用户首先要配置对象——关系映射文件。不同ORM软件的元数据的语法不一样
只要配置了持久化类与表的映射关系,ORM中间件在运行时就能参照映射文件的信息,把域对象持久化到数据库中
3.2.3、Hibernate API简介
应用程序可以直接通过Hibernate API访问数据库。Hibernate提供的接口可以分为以下几类:
提供访问数据库的操作的接口。这些接口包括:Session、Transaction和Query接口
用于配置Hibernate的接口:Configuration
回调接口,使应用程序接受Hibernate内部发生的事件,并作出相关的回应。这些接口包括:Interceptor、Lifecycle和Validatable接口
用于扩展Hibernate功能的接口,如:UserType、CompositeUserType接口。如果需要的话,应用程序可以扩展这些接口
Hibernate内部封装了JDBC、JTA、JNDI。JDBC提供底层的数据访问操作,只要用户提供了相应的JDBC驱动程序,Hibernate可以访问任何一个数据库系统。JNDI和JTA使Hibernate能够和J2EE服务器集成