面试常见问题heibernate中sessin的get和load方法区别的实验解说

假设存在实体 Comment.java ,数据库中存在数据:
id        content
1          Java
2          Ruby

现在通过实验比较get和load方法区别:

  Comment c= (Comment)session.get / load (Comment.class, 3L);
 

因为不存在ID为3的comment,通过Eclipse的watch功能,比较结果如下:

get方法:console打印出select语句,并且返回null
load方法:console并没有打印出select语句, 返回一个代理对象,这个代理对象的id为3,initialized属性为false,这个对象是延迟加载的。也就是说,只有使用这个代理对象的时候才去数据库拿数据(注:c.getId()是不会触发加载实体的事件的,也就是说调用c.getId()会返回3,而且不会报告异常),如果不存在改对象则抛出异常。

另外注意:如果执行get 或者load方法前要装载的对象以及存在于session缓存中,则get和load都不会查找数据库的,而是直接从缓存拿数据。

误区:
    get方法保证每次获取数据来自数据库
     这个是不正取的,如果实体存在于缓存中将直接从缓存拿数据,而不去数据库抓取。来看看官方API的说明:

Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance. (If the instance, or a proxy for the instance, is already associated with the session, return that instance or proxy.) 

括号中的话:如果实例或者代理实例已经关联一个session,则直接返回session中的实例

结论:

get方法:如果当前关联实体的缓存和数据库中都不存在指定ID的实体,则返回null

load方法:如果当前关联实体的缓存中不存在指定ID实体,则返回一个lazy loading的代理对象,如果使用这个代理对象的数据时,则去数据库抓取,如果数据库也抓取不到,则抛出HibernateException




 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值