Hibernate体系结构剖析

首先,我们先来模拟一个应用场景,针对的是MVC三层结构的网站,模拟的是客户端注册用户的场景。假设注册一个用户需要在表单中填入帐号和密码,当我们填完注册信息,点击提交时,注册信息提交到了服务器端的控制层,再由控制层调用模型层中的Dao对象将注册信息添加到数据库中去。实际上这么一个简单的流程,涉及到了两次的数据转换。首先,当我们在客户端注册表单中填入注册信息时,信息是以map结构(即键值对形式,例如密码信息,其存在形式为(password,”…”))存在的,我们可以称之为扁平数据;然后注册信息传到控制层,由控制层将那些零散的扁平数据封装为OO数据(即面向对象的数据,称之为pojo/vo对象,那些零散的注册信息封装成pojo对象的属性,例如这里的注册信息就可以封装到user对象当中去);接着,控制层调用模型层中的Dao对象,将OO数据在Dao对象中又拆成各个零散的扁平数据,然后通过执行sql语句将注册信息添加到数据库中去。假设我们用的是关系型数据库,那么,注册信息在数据库中的存在形式就是关系型数据(有一点我们需要理解的是,数据是信息的载体,同样的数据在不同的环境下所表达的信息也许是不一样的)。

好了,现在我们在脑子中试想一下这个流程,以及数据之间的转换。是否会感觉到有点繁琐呢?我想答案是肯定的。那么,我们有没有一个稍微好一点的方法来解决这个繁琐的问题呢?这时候,ORM理念就派上用场了。什么是ORM呢?先来看一下它的全称,object relation mapping(对象关系映射)。我想,通过它的名称我们便可以对它的思想有些许了解。所谓对象关系映射,就是将应用程序中的对象跟关系数据库中的关系表的记录建立一种映射关系(或者我们说将应用程序中的pojo类,与关系数据库中的表建立映射关系,这里需要注意的是类和对象的区别)。那么,ORM理念究竟是如何解决我们上面提出的那个问题呢?实际上是这样的,针对上面我们模拟的那个注册场景,当注册信息在控制层封装为user对象后,假如我们事先建立了user类跟数据库中user_info表的映射关系,那么,当控制层调用Dao对象时,便可以直接将user对象中所包含的注册信息保存到user_info表中的相关字段上(一个对象映射为一条记录)。但是,这个映射过程究竟是如何实现的呢?是不是有这么一种工具会帮我们做这么一件事呢?是的,的确有这样的工具,我们称之为ORM工具,例如hibernate、ibatis框架等等。

这里,我们着重来剖析一下hibernate框架的体系结构。首先,让我们了熟悉一下hibernate框架中所包含的元素:
1.hibernate.cfg.xml:hibernate配置文件,用来配置应用程序所连接的数据库的相关信息以及连接信息。
2.pojo.hbm.xml:hibernate映射文件,用来配置应用程序中的pojo类与数据库表的映射关系(类的属性映射为表的字段),需要注意的一点是,我们必须将hibernate映射文件的存储路径配置到hibernate配置文件中,以便程序运行时系统能找到hibernate的映射信息。
3.Configuration:用来获取hibernate.cfg.xml文件的配置信息,并且可以根据相关的配置信息来创建SessionFactory对象。
4.SessionFactory:主要用来创建session对象(注,不要将这里的session对象与jsp内置对象中的session混淆)的工厂类。SessionFactory中有一个session池,用来存储session。
5.Session:主要用来持久化对象,也就是将应用程序中的OO数据持久化到数据库中去。其底层实现是由JDBC/JTA/JNDI这样的技术实现的。每一个session对象都对应一个connection对象
6.TransactionFactory:事务工厂类,用来创建事务对象的。实际上,一个session对象就是一个TransactionFactory对象。
7.Transaction:事务对象,是由TransactionFactory对象创建的。编写一个事务在代码中包括了三个阶段:开启事务(调用transaction对象的begin()方法),编写事务处理内容,提交事务(调用transaction对象的commit()方法)。当执行了事务对象的commit()方法后,事务要处理的内容才被执行。事务要么全部成功,要么全部失败,可以将一个事务理解为是一个原子操作。

好了,以上就是hibernate框架中我们常用到的对象,它们贯穿了hibernate框架的整个业务流程(这里我们暂且不考虑hibernate框架的底层操作)。或许,熟悉了上面所介绍的几个hibernate元素,我们对于hibernate整个业务流程还不是很清晰。接着,我们沿用上面我们所模拟的注册场景,来一起走一下hibernate的业务流程。首先,我们在客户端提交注册信息,注册信息被提交到服务器端的控制层,并在控制层中被封装为user对象(即模型层中的pojo对象),然后控制层调用模型层中的Dao对象,并由Dao对象创建session对象(这个创建过程实际上包含了configuration对象的创建,然后由configuration对象去读取hibernate配置文件中的配置信息并创建sessionFactory对象,最后由sessionFactory对象创建了session对象),接着,由session对象创建transaction对象,并在transaction事务对象的开启和提交动作之间执行session.save(user)操作,最后,当然只要一切顺利的话,数据库中的user_info表中就多了一条记录了(这里的一切顺利,并非指的是一切看造化,而是说我们的整个配置过程、编码过程都正确)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
   [Hibernate体系结构的概要图] Hibernate体系结构的概要图 Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。    Session接口 Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。   SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。   Configuration接口 Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口   Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。 Query和Criteria接口   Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值