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的基础引用:如映射、缓存、抓取等、注解映射。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值