Hibernate的get和load方法学习

一.Hibernate简介
      Hibernate是一个轻量级的持久层框架,是一个全自动的orm框架,为什么这说呢?因为它可以自动生成SQL语句,使得Java开发者可以随心所欲的运用对象编程思维来操纵数据库,从这点来说大大减轻了开发者的负担,在日常生活中大量SQL语句的书写会让开发者焦头烂额,我想这也是开发这套框架作者的初衷吧。但是万事皆有它的利弊,当你得到一些东西的同时总会失去一些东西,所以这个框架在大量减少开发者负担的同时也带来的别的问题,那就是在用此框架进行多表查询时,会严重影响程序的运行效率,其实这点也是很好理解的,大家都知道所有的框架都是都是对Java底层的封装,这个框架封装的当然是JDBC,所以框架中会书写大量的代码来分析传入的参数,以此来编写SQL语句对数据库进行操作,同时也是因为这个问题的存在,才会引申出另外的orm框架MyBatis,所以后来很多项目在架构的时候为了更好的提高程序运行的效率,单表查询用hibernate,多表查询用Myb,当然这不是这篇博客的重点,后续博客中会涉及到。
二.get和load方法(Hibernate3.2 为例
     1.get方法
public <T> T get(Class entityClass, Serializable id)
  {
    return (T)getCurrentSession().get(entityClass, id);
  }

     对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!


      2.load方法    
       load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:
       (1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
       (2)若为false,就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

结束语
     Hibernate中,对于get和load方法的根本区别,就在于Hibernate对于load方法认为数据库中一定存在要检索的数据,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,那么只能抛出异常;而对于get方法,Hibernate一定要获取到真实的数据才会返回对象,否则返回null。

参考文章:
2.http://blog.csdn.net/happylee6688/article/details/17314615

猜你喜欢

转载自blog.csdn.net/hy_coming/article/details/78192946