Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库, Hibernate可以大大减少操作数据库的工作量。 另外Hibernate可以利用代理模式来简化载入类的过程,这将大大减少利用Hibernate从数据库提取数据的代码的编写量,从而节约开发时间和开发成本Hibernate可以和多种Web 服务器 或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。事实上Hibernate已经成为java数据持久层的一个工业标准。
Hibernate技术本质上是一个提供数据库服务的中间件。具有很大的灵活性,但同时它的体系结构比较复杂,提供了好几种不同的运行方式。在轻型体系中,应用程序提供JDBC连接,并且自行管理事务,这种方式使用了Hibernate的一个最小子集;在全面解决体系中,对于应用程序来说,所有底层的JDBC/JTA API都被抽象了,Hibernate会替你照管所有的细节。
一、Hibernate的核心类和接口
1、Configuration类:是Hibernate的入口,负责配置并启动Hibernate。Hibernate框架通过Configuration实例加载配置文件信息,然后读取指定对象关系映射文件的内容并创建SessionFactory实例。
2、SessionFactory接口:负责初始化Hibernate,一个SessionFactory实例对应一个数据存储源(一般指一个数据库)。应用程序从SessionFactory中获得Session实例。SessionFactory具有以下特点:
线程安全:即同一个SessionFactory实例可以被应用的多个线程共享。
它是重量级的:因为它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等。
3、Session接口:是Hibernate中应用最频繁的接口。Session也被称为持久化管理器,负责管理所有与持久化相关的操作:如存储、更新、删除和加载对象等。Session具有以下特点:
单线程,非共享对象:线程不安全,在设计软件框架时,应该避免多个线程共享同一个Session实例。
Session实例是轻量级的:它的创建和销毁不需要消耗太多的资源。
Session有一个缓存:存放当前工作单元加载的对象。
4、Transaction接口:是Hibernate框架的事务接口。它对底层的事务接口做了封装,包括:JDBC API和JTA。这样,使得Hibernate应用可通过一致的Transaction接口来声明事务边界,这有助于应用程序在不同的环境和容器中移植。
5、Query和Criteria接口:它们是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程。Query包装了一个HQL(Hibernate Query Language)查询语句;而Criteria接口完全封装了基于字符串形式的查询语句,比Query更加面向对象,Criteria几口擅长执行动态查询。
二、 Hibernate的工作过程:
1、启动Hibernate
2、构建Configuration实例:Configuration cfg=new Configuration().configure();
3、configuration实例加载hibernate.cfg.xml文件至内存。
4、configuration实例根据hibernate.cfg.xml文件加载映射文件(*.hbm.xml)至内存。
5、configuration实例构建一个SessionFactory实例:SessionFactory sf=cfg.buildSessionFactory();
6、SessionFactory实例创建Session实例:Session session=sf.openSession();
7、由Session实例创建Transaction的一个实例,开启事务:Transaction tx=session.beginTransaction();
8、通过Session接口提供的各种方法操作数据库:Session.save()、update()、saveOrUpdate()、delete()、get()、load()、createQuery()等。
9、提交或回滚事务:tx.commit()、tx.rollback()
10、关闭Session:session.close()
从不同角度解释Hibernate:
1、它是连接Java应用程序和关系数据库的中间件。
2、它对JDBC API进行了封装,负责Java对象的持久化。
3、它是一种ORM工具,能够建立面向对象的域模型和关系模型的映射。
对象关系映射(Object Relation Mapping,ORM)是一种用来完成从对象模型到关系模型的映射技术。就是一种把应用程序中的对象数据持久化到关系数据库表的一种技术。
持久化顾名思义就是把缓存中的东西放到数据库中使之持久.对于需要持久化的对象,它的生命周期分为:
(1)瞬时状态(transient):刚刚用new语句创建,没有被持久化,不处于session的缓存中。它没有对象标识符值(主键值)。
特点:不跟任何一个Session实例关联。在数据库中没有对应的记录。
(2)持久化状态(persistent):已经被持久化,加入到session的缓存中。拥有对象标识符值,并且可能在数据库中有一个对应的行。Hibernate保证在同一个Session实例的缓存中,数据库中的每条记录只对应唯一的一个持久化实例。
特点:持久化对象总是被一个Session实例关联。持久化实例和数据库中的相关记录对应。Session在清理缓存时,会根据持久化实例的属性数据变化,同步更新数据库。
持久化对象的特征:
. 位于一个session事例的缓存中,可以说持久化对象总是被一个session事例关联
. 持久化对象和数据库中的相关记录对应
. Session在清理缓存时,会根据持久化对象的属性变化来同步更新数据库
. Session的save()方法把临时状态变为持久化状态.
. Session的update() ,saveOrUpdate()和lock()方法使游离状态变为持久化状态.
(3)移除状态(removed):如果一个对象应经被计划在一个Session上下文结束时删除,它就处于移除状态,但仍然处于Session缓存中,直到工作单元结束。
实例处于移除状态时不应该被重用,因为一旦工作单元完成,它就将立即从数据库中被删除。
(4) 脱管状态(detached):已经被持久化,但不处于session的缓存中。实例曾经与某个Session上下文发生过关联,不过那个上下文已被关闭。它拥有对象标识符值,并且在数据库中可能存在一个对应的行。
特点:不再位于Session缓存中,即它不再和Session关联。但它拥有对象标识符值。