Hibernate ,一个开源的对象关系映射 ( ORM Object Relation Mapping )框架,即将关系型数据库转换为对象。 Hibernate 对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思想来操作数据库(即采用面向对象的方式来操作关系型数据库),所以 Hibernate 可以应用在任何使用 JDBC 的场合。用一句话来说, Hibernate 是面向对象程序设计语言和关系型数据库之间的桥梁 。
说明:
轻量级和重量级概念:
轻量级架构:用一个包导一个包
重量级架构:只需要用一个,需要导入全部 jar 包
所以量级主要是看容器的依赖性所决定,依赖性越小,越轻量
基于 RDB 的持久层可选方案:
名称 |
优点 |
缺点 |
SQL/JDBC |
成熟、流行,使用 DAO 模式 |
代码繁杂、可读性差、维护困难、移植困难 |
EntityBean |
CMP ( EJB1.1 之后),未来的 EJB3 |
错误的设计,不可移植,依赖性强,不可序列化,不支持多态的关联查询 |
JDO |
简单、透明、标准 |
不够成熟 |
Apache OJB |
性能、稳定性 |
文档资源太少,支持标准太多成了负担 |
iBatis/ myBatis |
可以控制更多的数据库操作细节,适用于遗留系统的改造和对既有数据库的复用 |
持久层封装不够彻底,只是一个 DBHelper |
Hibernate |
成熟、流行、功能强大,并逐渐发展成为 Java 持久层的标准 |
不够透明,执行效率不高 |
Hibernate 结构:
支持 JDBC 、 JNDI 、 JTA ( Java 事务 API ), Hibernate 中常用的类( Transaction 、 Session 、 SessionFactory )
1、Configuration 负责管理Hibernate的配置信息,这些配置信息都是从配置文件hibernate.cfg.xml或者Hibernate.properties读取的,当然也可以自定义文件名称,只要在实例化Configuration的时候指定具体的路径就可以了。 2、SessionFactory Configuration的实例会根据当前的配置信息,构造SessionFactory实例。 SessionFactory是线程安全的,一般情况下一个应用中一个数据库共享一个SessionFactory实例。 一般的持久化方法(CRUD)都是通过Session来调用的,Session是非线程安全的 |
说明:
持久化概念:
所谓的持久化就是将程序数据在持久状态和瞬时状态间转换的机制 。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、 XML 数据文件中等等。
( 1 )瞬时状态 (transient)
保存在内存中的数据。程序退出后,数据就消失了。
( 2 )持久状态 (Persisten)
在一定周期内保持不变就是持久化 , 持久化是针对时间来说的 . 数据库中的数据就是持久化了的数据 , 只要你不去删除或修改。比如在 IE 浏览器中一次 Session 会话中 Session 对象变量也是不变的 , 是 Session 容器中持久化,对象持久化的方式有很多种 , 根据周期不同有 ,page,Session,Application 。
hibernate 为应用程序提供了高效的 O/R 关系映射和查询服务,为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。他也是对对象持久化一个很好的实现。
Hibernate 映射结构:
将数据库中表通过 XML 映射找到对应的 POJO 类(相当于 VO )
说明:
POJO 、 VO 、 DAO 、 PO 、 BO 、 DTO 概念:
DAO ,最好理解,就是 data access object ,数据访问对象,主要用来封装对 DB 的访问;
1 、 POJO , plain ordinary java object 无规则简单 java 对象。一个中间对象,可以转化为 PO 、 DTO 、 VO 。
POJO 持久化之后 ==> PO
POJO 传输过程中 ==> DTO
POJO 用作表示层 ==> VO
PO 和 VO 都应该属于它。
2 、 VO , :vvalue object 值对象 / view object 表现层对象。
A 、主要对应页面显示( web 页面 /swt 、 swing 界面)的数据对象。
B 、可以和表对应,也可以不,这根据业务的需要。
注 :在 struts 中,用 ActionForm 做 VO ,需要做一个转换,因为 PO 是面向对象的,而 ActionForm 是和 view 对应的,要将几个 PO 要显示的属性合成一个 ActionForm ,可以使用 BeanUtils 的 copy 方法。
3 、 PO , persistant object 持久对象 , 最形象的理解就是一个 PO 就是数据库中的一条记录。 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
4 、 BO , business object 业务对象 , 可以包括多个 PO ,通常需要将 BO 转化成 PO ,才能进行数据的持久化,反之,从 DB 中得到的 PO ,需要转化成 BO 才能在业务层使用。
关于 BO 主要有三种概念
A 、只包含业务对象的属性;
B 、只包含业务方法;
C 、两者都包含。
5 、 DTO ( TO ) : Data Transfer Object 数据传输对象
A 、用在需要跨进程或远程传输时,它不应该包含业务逻辑。
B 、比如一张表有 100 个字段,那么对应的 PO 就有 100 个属性(大多数情况下, DTO 内的数据来自多个表)。但 view 层只需显示 10 个字段,没有必要把整个 PO 对象传递到 client ,这时我们就可以用只有这 10 个属性的 DTO 来传输数据到 client ,这样也不会暴露 server 端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为 VO 。
在 Hibernate 中,最核心的概念就是对 PO 的状态管理。一个 PO 有三种状态:
1. 未被持久化的 VO ,此时就是一个内存对象 VO ,由 JVM 管理生命周期。
2. 已被持久化的 PO ,并且在 Session 生命周期内,此时映射数据库连接,由数据库管理生命周期。
3. 曾被持久化过,但现在和 Session 已经托管( detached )了,以 VO 的身份在运行。它还可以进入另一个 Session ,继续 PO 状态管理。
需要注意的是, PO 最好只在持久层使用,如果脱离持久层到处使用,会给 Hibernate 带来不小的 PO 对象维护开销。