hibernate get和load的区别

hibernate中用于获取数据的方法分成2种分类:

1.加载方式的区别:

   1).立刻加载方法:get   
      所谓的立刻加载就是只要缓存中没有这条记录,就立刻查询数据库

     public class Test2 {


/**
* @param args
*/
public static void main(String[] args) {
Session session=HibernateSessionFactory.getSession();
System.out.println("1: "+session);
session.beginTransaction();
Books b1=(Books)session.get(Books.class, 2);
System.out.println("2: "+session);
session.getTransaction().commit();
HibernateSessionFactory.closeSession();
}

}

执行了以下sql语句:

Hibernate: 
    select
        books0_.id as id0_0_,
        books0_.name as name0_0_,
        books0_.price as price0_0_,
        books0_.opendate as opendate0_0_,
        books0_.enddate as enddate0_0_,
        books0_.author as author0_0_ 
    from
        test.books books0_ 
    where
        books0_.id=?

      通过session获取一个对象后,这个对象会进入session缓存中托管,目的是希望重用数据,这其实就是hibernate中
      所谓的1级缓存(session级别缓存)

     

  2).延迟加载方法:load(慎用,如果在session关闭后才有“必须”查询点就会出现异常)  
     所谓的延迟加载就是在调用方法的时候并没有立刻查询数据库,而是等待“必须”查询点,
load的时候只是返回了一     个proxy对象,这个代理对象中只有id,不管这个id在数据库中是否存在都会返回一个代理对象。没有其他数据,只        有在触发必须查询点时才查询数据库。

     Books b1=(Books)session.load(Books.class, 2);

     此时b1对象中只有id值为2,只有查询b1对象的其他属性时(例如:b1.getName())才查询数据库,执行sql语句


2.get假如获取不到具体的数据,接着对对象进行操作,报空指针异常

    Exception in thread "main" java.lang.NullPointerException
  at com.test.Test2.main(Test2.java:24)

    load假如获取不到具体的数据,接着对对象操作,会报org.hibernate.ObjectNotFoundException异常


3.get对1级缓存可读可写,即查询一次然后将查询结果放入session缓存中,之后便可直接使用缓存中的数据
   load对1级缓存也是可读可写

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值