现在的位置: 首页 > 综合 > 正文

Hibernate中的几个核心接口

2013年03月22日 ⁄ 综合 ⁄ 共 2469字 ⁄ 字号 评论关闭

Hibernate是一个基于Java的对象/关系数据库映射工具,在使用Hibernate过程中,会发现Hibernate提供很多类,但常用的不会很多,其中最核心的就是关于整体数据库的配置文件和与之相关的类或接口,这些相关的类或接口分别是Configuration()SessionFactorySessionTransactionQueryCriteria接口。和Struts颇为相似的是,Struts的应用是由五个核心类ActionServletActionMappingActionFormActionActionForward构成的,该文《剖析Struts中的五个》中已做了介绍,那么接下来依旧按照分析Struts的思路来学习Hibernate,下图为Hibernate执行的大致流程图:


通过以上几个类或接口的互相配合和调用,完成了对象和关系数据库的之间的ORM自动映射,为程序员面向对象开发提供了良好的解决方案。

   Configuration类

Hibernate启动的过程中,首先new一个Configuration对象,然后通过configure方法定位并读取Hibernate的核心配置文件hibernate.cfg.xml(默认),然后根据该核心配置文件读取实体类映射文件**.hbm.xml

然后调用buildSessionFactory()方法创建SessionFactory对象,虽然Configuration类在整个Hibernate项目中只扮演一个很小的角色,但它是启动Hibernate时所遇到的第一个对象,此类的设计和Struts中的ActionMapping颇有几分相似。

  SessionFactory接口

   从字面来看这是一个工厂,意味着他用到了一个设计模式----工厂模式,并且用户程序可以通过openSession()方法创建Session实例,SessionFactory并不是轻量级的,它可以在整个进程中使用,一般一个项目只需要一个实例就可以了,但当项目要操作多个数据库时,一般为每一个数据库创建一个SessionFactory对象。

   SessionFactoryHibernate中实际起到了一个数据缓冲的作用,它缓冲了Hibernate自动生成的SQL语句和其他的一些映射数据,还缓冲了一些将来有可能重复利用的数据,它和二级缓存(后面讲)的生命周期是一致的。

  Session接口

   Session不同于HttpSession对象,它是Hibernate运作的核心,对象的声明周期、事务管理以及数据库的存取都与他密切相关,所以有效的管理Session成为使用Hibernate的重点。

Session其实就是对Connection的一层高级封装,他提供了对数据持久对象的CRUD操作,包含了很多常见的SQL语句,实例化的Session是一个轻量级的类,创建和销毁都不会占用很多资源,但Session是非线程安全的,因此在设计中,一个线程只创建一个Session对象。

一般可以将Session看成一个对象的缓冲区或持久层管理器,当持久对象被Session管理后,Hibernate在事务提交时能够自动检测缓冲区的持久化对象是否已经改变,也就是说持久化对象所携带的信息是否发生了改变(脏数据检查),然后与数据库进行同步操作。那这些对象和Session之间是如何打交道呢?且看对象的三种状态转换。


Transient(瞬时状态)

当我们在项目中用new关键字生成一个实体对象时,这时的实体对象就处于自由状态,因为他并没有通过Session对象save()方法保存进数据库,处于Hibernate缓存管理之外。因此自由对象最大的特点是:数据库中不存在一条与它对应的记录,不与Session实例关联

Persistent(持久状态)

持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象想在处于Hibernate的缓存管理之中,这时对该实体对象的任何修改,都会在清理缓存(脏数据检查)时同步到数据库中。

           持久对象总是与SessionTransaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。

     持久的实例在数据库中有对应的记录,并拥有一个持久化标识。

     Detached(脱管状态)

     当一个持久化对象,脱离Hibernate缓存管理后,他就处于游离状态,游离对象和自由对象最大的区别在于,游离对象在数据库中可能还存在一条与它对应的记录,而自由对象不会在数据库中出现与它对应的记录。

     与持久对象关联的Session被关闭后,对象就变为脱管对象,对脱管对象的引用依然有效,对象可以继续被修改。脱管对象特点:本质与瞬时对象相同,知识比瞬时对象多了一个数据库记录标识值id

   对象三个状态的转换上图已展露无遗,就不再文字描述了。

  Query和Criteria接口

     这两个接口负责执行各种查询,它可以使用HQLSQL语句两种表达方式。Query可以绑定查询参数、限制查询记录数量,并最终形成查询操作。Query接口是轻量级的,它不能在Session之外使用。

      Criteria接口与Query接口非常类似,它允许创建并执行面向对象的标准化查询。

   Transaction接口

     该接口负责事务相关操作,是可选的。Transaction接口是对实际事务实现的一个抽象,之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。

    其实熟练掌握了以上几个接口或类的使用,基本也就明白了Hibernate执行流程,想用一张时序图来总结一下。


    这篇博文拖了一个星期,终于总结完了。

【上篇】
【下篇】

抱歉!评论已关闭.