最近在读孙卫琴的《精通
Hibernate : JAVA
对象持久化技术详解》,深感
Hibernate
技术的灵活。当然,一个技术的灵活所带来的副面效应就是掌握它的难度随着灵活度的增加而增加。这本书是以
Hibernate2.0
蓝本讲解的,现在
Hibernate
已经发展到了
3.1
了。虽然现在显得有点过时了,但是
ORM
的思想还是一样的。以后的文章和代码都以
Hibernate3.1
为蓝本。
首先我们要解决一个问题就是,为什么我们要使用
Hibernate
技术。在
JAVA
世界中,已经有了由
SUN
提出的业界的标准
J2EE
规范,在规范中没有提到有
ORM
的影子,如果你说有的话,那也只是
CMP
(容器
Bean
)和
ORM
有些神似。但是毕竟
EJB
是个重量的东东,在你享受
EJB
带给你的种种优厚的待遇同时,你就不得不背负沉重的枷锁,这也就是为什么种种轻量级的框架在
JAVA
社区大行其道的原因之一。那么有没有一种方案使我们可以在不使用
EJB
的时候,还可以从容而且优雅的实现从对象到数据库的
mapping
呢?当然,那就是
Hibernate
。
在介绍
Hibernate
之前,首先让我们来看看软件的几种模型。
一、软件模型
l
概念模型:
概念模型清楚的描述出了问题域的实体。我们可以用一对一、一对多和多对多的关系来描述实体之间的关系。这种关系是技术人员和非技术人员都可以理解的,所以,我们要让客户或者领域专家帮助系统分析人员对概念模型中出现的问题做出修改。
l
关系数据模型:
当前的计算机只能用具有某种结构的形式来描述现实世界中的事物。从《数据结构》中我们知道,计算机世界中常用的数据结构有线形结构,树和图三大类结构。而表属于线形结构中的一种。计算机可以很方便的处理表这种结构的数据,所以,当前采用最广泛的还是关系型数据库(以后简称数据库)。
数据库通过用表,表的索引,视图和表与表之间的参照完整性来描述概念模型。
l
域模型和域对象:
我们需要在概念模型的基础上创建域模型,也叫做设计模型。域模型的主要内容有:
域对象:
域对象
(Domain Object)
:是构成域模型的基本元素,代表业务中的人、事物等。分以下三种:实体域,
J2EE
中的代表是实体
bean
;过程域,
J2EE
中的代表是
Session bean
或者是消息驱动
Bean
;事件域,代表应用中的事件。
域对象之间的关系:
1
、关联
一对多的单向关联
一对多的双向关联
2
、依赖
如果存在
class A
中
new class B
,就叫
A
依赖
B
。在实际的开发中,往往是过程域倚赖实体域。在
J2EE
的世界中,就是往往是由
Session Bean
来调用实体
Bean
。
3
、聚集:
描述整体和局部的关系。
4
、一般化
往往指类的继承关系
二、
ORM
介绍
ORM
的目的就是要把对象和关系的
mapping
。从上面的分析可以看出,二者的出发点是不同的,关系模型是面向关系的,域模型是面向对象的。它们的
mapping
如下:
面向对象
|
面向关系
|
类
|
表
|
对象
|
表中的记录
|
属性
|
表中的字段
|
三、
JAVA
世界中的其他持久化模式
1
、主动域对象模式
2
、
JDO
模式
3
、
CMP
模式(和
ORM
和类似,不过
CMP
是用在
EJB
容器当中,用来持久化
EJB
组件)。