Hibernate浅析

以前学习一些新的技术,总是了解它是怎么应用的就可以了,很少去关注它的内部原理。后来发现,如果一段时间不去熟悉这个新技术,几乎什么都想不起来。但是如果深入的去了解了一些技术的实现原理,了解其中的实现机制,即使很久不去触碰这个技术只要简单的温习一下,就能很快的上手。所以我们就先来简单的了解一下Hibernate的原理吧。

1.      什么是Hibernate

我们在用java连接数据库时,首先想到的是JDBC。而Hibernate我们可以把它理解为一个中间件(见下图),它负责把java程序的sql语句接收后发送到数据库,而数据库返回的信息让hibernate接收后,会直接生成一个对象传给java。由上可见,它是应用了O/R Mapping映射思想,对JDBC做了一个轻量级的封装,这样我们就可以使用面向对象的思想来操纵数据库。

它不仅提供了从java类到数据库表间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL手工操作数据库,Hibernate大大减少操作数据库的工作量。另外Hibernate可以利用代理模式简化载入类的过程,这将大大较少利用Hql从数据库提取数据的代码编写量,从而节省开大时间和开发成本。

Hibernate可以应用在任何使用JDBC的场合,即可以在java的客户端使用,也可以在Servlet/JSP的web应用中使用,更具革命意义的是,hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

因为它封装的很彻底,大家不知道数据库的存在,所以数据库换了也不知道,所以具有很好的移植性。此外它是轻量的,不需要继承和实现它的任何东西就可以用,并且测试简单,不用启动任何的服务,没有任何的侵入性。

2.      工作原理

(1)      通过Configuration().configure();解读并解析hibernate.cfg.xml配置文件;

(2)      由hibernate.cfg.xml中的<mapping resource=”com/**/**.hbm.xml”/>读取并解析映射信息;

(3)      通过config.buildSessionFactory(),来创建Sessionfactory;

(4)      sessionFactory.openSession(),来打开session;

(5)      session.beginTransaction(),创建事务Transaction;

(6)      persistentoperate持久化操作;

(7)      session.getTransaction().commit(),来提交事务;

(8)      关闭session;

(9)      关闭SessionFactory;

具体描述就是应用程序先调用Configuration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactory对象。然后从SessionFactory对象生成一个session对象,并用Session对象生成Transaction对象,可通过Sesssion对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作,如果没有以上,Transaction对象将提交这些操作结果到数据库中。下面是我自己整理整理的一个图和引用别人的一个图,以便加深对hibernate的运行了解。

3.持久化状态

(1)临时状态(Transient):用new创建的对象,没有持久化,没有处于Session中,处于此状态的对象叫临时对象。

(2)持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象,处于此状态的对象叫持久对象。

(3)游离状态(Detached):持久化对象脱离了Session的对象。如:Session缓存被清空的对象。特点是已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象。

当我们new一个对象的时候,这个对象的状态是transient的,特点是数据库里没有,另外一个特点是不被session管理;没有被session管理,就是没有放在session里,session里有个map,当save的时候它先放在了map中,到时候再放在数据库里。

当对这样的对象save一下时,它的状态就变为Persistent,此时的状态为被session管理,数据库里就有相关的东西了。当我们调用delete,数据库里相关的东西被删除了,又变成了transient。很容易被垃圾回收器回收。Persistent状态,纳入了session状态,在session的对象里,我们可以把它给清除了,可以evict就是一个一个清掉,close就是把session给关掉,clear就是把session里的东西都给清除了,此时的状态是session里没有,而数据库里有,清理过后,数据库里就有,所以现在就变一个状态Detached。

Detached是数据库里有数据,所以就可以update。SaveOrUpdate是如果有就往里加,没有就update。当我们get或者load一个对象,它具有persistent状态。所以我们说session不是一个普通的connection,他是一个持久化管理器。进到session和从session出来是不一样的。

后续我还会整理一些hibernate的基础引用:如映射、缓存、抓取等、注解映射。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 04:12:30

Hibernate浅析的相关文章

SSH网上商城环境配置—浅析Hibernate

SSH网上商城虽然只有四天的视频,day01-04,不过边做项目边学习,还真是不容易,到现在为止已经进行了半个月了,才完成了两天的内容.其中光一个环境配置就花了十天左右的时间,包括配置文件添加.Jar包的添加等等.敲代码时再加上对开发环境的陌生,着实费了不少劲,调试也花费了好长时间,不过还好,现在已经熟悉一点了,做起来也顺手一些了,下面就简单汇总一下这里面用到的技术. SSH是集成框架,它是从三层的基础上发展而来的.三层中包括页面显示层.业务逻辑层.数据库操作层,SSH中同样也是,只不过每个层使

Hibernate问题浅析

1.什么是SessionFactory?什么是Session?httpsession和hibernate的session的有什么区别? SessionFactory接口负责初始化Hibernate.它充当数据存储源的代理,并负责创建Session对象.这里用到了工厂模式.需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory.----百度百科 在h

浅析Hibernate映射(二)——关系映射(5)

单向多对多关联映射 单向多对多关联对象模型: 映射后的关系模型: 多对多映射,会产生第三张表来维护关系 映射文件: User.hbm.xml [html] view plaincopyprint? <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.so

浅析Hibernate映射(二)——关系映射(4)

单向一对多关联映射 映射后的关系模型: 映射文件: 一对多关联映射和多对一关联映射映射原理是一致的,都是在多的一端加入一个外键,指向一的一端 它们的区别在于维护的关系不同: * 多对一维护的关系是:多指向一的关系,有了此关系,在加载多的时候可以将一加载上来 * 一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来 Group.hbm.xml [html] view plaincopyprint? <?xml version="1.0"?> <

浅析Hibernate映射(三)——继承映射

对象模型示例: 继承映射的实现方式有三种: (一)每棵类继承树一张表 关系模型: 映射文件: [html] view plaincopyprint? <hibernate-mapping package="com.jialin.hibernate"> <class name="Animal" table="t_animal" lazy="false"> <id name="id"

ibatis和Hibernate的比较浅析

1.Hibernate HIbernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操作数据库,Hibernate可以应用在任何使用JDBC的场合,即可以在Java的客户端程序使用,也可以再Servlet.Jsp的weby应用中使用,最具有革命意义的是,Hibernate可以再应用EJB的J2EE架构中取代CMP,完成数据持久化的重任. 1.1.基本功能 Hibernate作为数据持久化的中间件,足以让数据在业务逻辑层

浅析Hibernate映射(二)——关系映射(3)

双向一对一关联映射 与单向一对一关联映射一样,双向映射依然可以采用两种方式实现:1.主键关联:2.唯一外键关联 1.主键关联 映射出的关系模型与单向一样: 映射文件与单向的区别在于:需要在Card加入<one-to-one>标签,指示hibernate将关联对象User根据主键加载上来.<one-to-one>不影响存储,只影响加载 User.hbm.xml [html] view plaincopyprint? <?xml version="1.0"?&

浅析Hibernate映射(五)——集合映射

集合映射主要包括:set.list.array.map的映射 对象模型: 映射后的关系模型: 映射文件: [html] view plaincopyprint? <hibernate-mapping> <class name="com.jialin.hibernate.CollectionMapping" table="t_collection_mapping"> <id name="id"> <gene

浅析Hibernate映射(四)——组件映射(component)

Component映射 在hibernate中Component映射采用<component>标签即可 Component是某个实体的逻辑组成部分,它与实体类的主要差别在于,它没有oidComponent在DDD中被称为值类 采用Component的好处:实现对象模型的细粒度划分,复用率高,含义明确,层次分明 对象模型与关系模型的设计恰恰相反,对象模型一般是细粒度的,关系模型一般是粗粒度的 示例: 对象模型: 关系模型: 映射文件: Employee.hbm.xml [html] view p