日期:2014-05-19  浏览次数:20615 次

【J2EE】Hibernate入门基础概念整理

第一次接触Hibernate已经是4年前的事情了,通过myeclipse可以直接生成实体类,甚感框架之神奇,最为神奇的是,习惯使用ibatis之后就再也没用过Hibernate了。

不得不承认,当习惯了一个方式处理一类事情之后,就总设法用最习惯的方式去面对所有问题了,直到遇到了不得不换种方式的时候,现在就是这个时候了。

好,不多废话了,开始整理Hibernate

一、Hibernate入门常识:

1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之
间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程
和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差
异就表现在内存中的对象状态发生了变化。 
2. 为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保
存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大
量对象信息。从Java 程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功
能来说,应该是一个很不起眼的附属功能,java 采用jdbc 来实现这个功能,这个不起眼的
功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的jdbc
代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活
和重复性的工作。 
3. 通过数据库保存 java 程序运行时产生的对象和恢复对象,其实就是实现了 java 对象与关
系数据库记录的映射关系,称为ORM(即Object Relation Mapping),人们可以通过封装 JDBC
代码来实现了这种功能,封装出来的产品称之为 ORM框架,Hibernate 就是其中的一种流行
ORM框架。使用 Hibernate 框架,不用写 JDBC 代码,仅仅是调用一个 save 方法,就可以
将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。 
4. 使用Hibernate 的基本流程是:配置 Configuration 对象、产生 SessionFactory、创建 session
对象,启动事务,完成CRUD 操作,提交事务,关闭session 。 
5. 使用Hibernate 时,先要配置 hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,
还要为每个实体配置相应的hbm.xml 文件,hibernate.cfg.xml文件中需要登记每个hbm.xml
文件。 
6. 在应用Hibernate 时,重点要了解 Session的缓存原理,级联,延迟加载和 hql 查询。

细细品读上面这几句话,如果没懂,建议顺延学习Hibernate计划。


二、Hibernate工作原理

Hibernate 的初始化.
  读取Hibernate 的配置信息-〉创建Session Factory
   1)创建Configeration类的实例。
     它的构造方法:将配置信息(Hibernate config.xml)读入到内存。
     一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。
   2)创建SessionFactory实例
     把Configeration 对象中的所有配置信息拷贝到SessionFactory的缓存中。
     SessionFactory的实例代表一个数据库存储员源,创建后不再与Configeration 对象关联。
     缓存(cache):指Java对象的属性(通常是一些集合类型的属性--占用内存空间。
     SessionFactory的缓存中:Hibernate 配置信息。OR映射元数据。
    缓存-大:重量级对象 小:轻量级对象
  3)调用SessionFactory创建Session的方法
     1.用户自行提供JDBC连接。
       Connection con=dataSource.getConnection();
       Session s=sessionFactory.openSession(con);
     2.让SessionFactory提供连接
       Session s=sessionFactory.openSession();
  4)通过Session 接口提供的各种方法来操纵数据库访问。

三、Hibernate缓存体系

一级缓存:
Session 有一个内置的缓存,其中存放了被当前工作单元加载的对象。
每个Session 都有自己独立的缓存,且只能被当前工作单元访问。
二级缓存:
SessionFactory的外置的可插拔的缓存插件。其中的数据可被多个Session共享访问。
SessionFactory的内置缓存:存放了映射元数据,预定义的Sql语句。


四、Hibernate中Java对象状态

1.临时状态 (transient)
     特征:
	1.不处于Session 缓存中
	2.数据库中没有对象记录
     Java如何进入临时状态
	1.通过new语句刚创建一个对象时
	2.当调用Session 的delete()方法,从Session 缓存中删除一个对象时。
2.持久化状态(persisted)
    特征:
	1.处于Session 缓存中
	2.持久化对象数据库中设有对象记录
	3.Session 在特定时刻会保持二者同步
    Java如何进入持久化状态
	1.Session 的save()把临时->持久化状态
	2.Session 的load(),get()方法返回的对象
	3.Session 的find()返回的list集合中存放的对象
	4.Session 的update(),saveOrupdate()使游离->持久化
3.游离状态(detached)
    特征:
	1.不再位于Session 缓存中
	2.游离对象由持久化状态转变而来,数据库中可能还有对应记录。
    Java如何进入持久化状态->游离状态
	1.Session 的close()方法
	2.Session 的evict()方法,从缓存中删除一个对象。提高性能。少用。


这个需要看看Hibernate持久对象状态图:


五、Hibernate学习建议

根据自身经验,J2EE框架学习还是以项目为中心,框架只是让项目更快更好的完成。明白了这一点之后,就需要准备一些相关资料,电子书或图书馆借本厚厚的那些不怎么常用的但可以当字典使用的书籍。当遇到某个功能无法正常实现是,解决方法建议是

仿照别人代码--》实现功能--》重构代码--》查看原理--》记录心得

       总之,学习框架的前提是基础已经很扎实,需要提高工作效率才应用的,初级程序员建议还是多增加自己有效代码量,不要过早的去接触成熟框架。

dml@2012.12.7