慢慢来比较快,虚心学技术
原文链接:《Spring实战》-第十一章:利用对象-关系映射持久化数据
一、什么是对象-关系映射(ORM)/为什么需要对象-关系映射
先来了解几个概念:
- 瞬时状态:在程序运行的时候,有些数据保存在内存中,当程序退出后,这些数据就不复存在了,称这些数据的状态是瞬时的。
- 持久状态:数据以文件形式保存在辅存中,这样,程序退出后,数据依然存在,这种状态称之为持久的。
- 持久化 :即在程序中的瞬时状态和持久状态之间转换的机制。
实际上,我们通常所说的持久化,一般指的持久化数据到数据库中。
在数据持久化的世界里面,传统的dao已经很难满足开发的需求,或者显得过于臃肿耦合,程序代码中存在大量的问号字符串(SQL语句)。那么,使用对象-关系映射将对象属性映射到数据库表的列字段,从而实现操作对象以操作数据记录,简化代码就很有必要了,同时我们还需要学习用到几个特性:
- 延迟加载( Lazy loading ):随着我们的对象关系变得越来越复杂,有时候我们并不希望立即获取完整的对象间关系。举一个典型的例子,假设我们在查询一组 PurchaseOrder 对象,而每个对象中都包含一个 LineItem 对象集合。如果我们只关心 PurchaseOrder 的属性,那查询出 LineItem 的数据就毫无意义。而且这可能是开销很大的操作。延迟加载允许我们只在需要的时候获取数据。
- 预先抓取( Eager fetching ):这与延迟加载是相对的。借助于预先抓取,我们可以使用一个查询获取完整的关联对象。如果我们需要 PurchaseOrder 及其关联的 LineItem 对象,预先抓取的功能可以在一个操作中将它们全部从数据库中取出来,节省了多次查询的成本。
- 级联( Cascading ):有时,更改数据库中的表会同时修改其他表。回到我们订购单的例子中,当删除 Order 对象时,我们希望同时在数据库中删除关联的 LineItem 。
一些可用框架提供了上述服务,这些服务的通用名称是对象 / 关系映射( object-relational mapping , ORM )。在持久层使用 ORM 工具,可
以节省数千行的代码和大量的开发时间。 ORM 工具能够把你的注意力从容易出错的 SQL 代码转向如何实现应用程序的真正需求。
二、Spring对ORM框架的支持与扩展
Spring对多个持久化框架的集成提供了支持,这些框架包括
Hibernate:可能是最常用的ORM框架,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
iBATIS:Apache推出的一种轻量级的对象关系映射(ORM)框架
Java数据对象( Java Data Objects , JDO ): 是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL)语句。JDO是作为Java数据库连接(JDBC)的一个补充来介绍的,而JDBC是一个支持使用SOL语句对流行的数据库程序进行访问的接口。有了 JDO,程序员就可以使用类来定义数据对象,然后支撑程序就会根据类的定义来管理对给定数据库的实际的数据访问了。
Java持久化 API ( Java Persistence API , JPA ):JAVA 持久化API,是EJB 3.0 的专家推出,作为 JSR-220的一部分,简单点来说可以理解为是一个JAVA的标准规范,这个规范为对JAVA对象的持久化制定了一些标准的接口,也可以说,JPA****是一个标准的ORM(对象关系映射)规范,提出这个规范,一方面是为了简化EJB中对于对象持久化的操作,另一方面,也希望通过制定统一规范,达到一统ORM标准的目的
除了对这些框架提供集成支持,Spring还提供了额外的扩展增强服务:
- 支持集成 Spring 声明式事务;
- 透明的异常处理;
- 线程安全的、轻量级的模板类;
- DAO 支持类;
- 资源管理
三、JPA框架分析
简单来说,JPA只是一套规范,用于统一对象持久化操作的标准。其架构组成如下:
JPA的主要组成封装于Javax.persistence.jar包中:
- Persistence****:主要提供静态方法获取EntityManagerFactory实例
- EntityManagerFactory****:作为EntityMannage的工厂类,用于生产并管理多个EntityManager
- EntityManager****:****管理持久化对象,作为数据库操作的接口
- EntityTransaction****:用于管理EntityManager操作,每个EntityManager对应一个EntityTransaction
- Query****:由JPA供应商提供,能够获取一个标准的关系对象并执行数据库操作
- Entity****:持久化对象/实体
网友评论