数据库返回Hibernate中的get和load有何不同?

发一下牢骚和主题无关:

    http://javarevisited.blogspot.tw/2012/07/hibernate-get-and-load-difference-interview-question.html

    

    

最大的差别:检索策略不同

    get:

     如果Session缓存中没有相关对象 ,get会立即拜访数据库;返回一个被完整初始化的对象;可能触及多次数据库调用。

    ——session.get()、query.list()总是会停止立即检索,即便已设为应用延迟检索。

    

    load:

    如果Session缓存中没有相关对象,load其实不立即查询数据库,不执行select,仅返回BO的一个代理类实例

    

  • 这个代理类扩展自BO类,由Hibernate在运行时应用CGLIB工具动态产生;
  • 代理类实例仅初始化OID属性,其他属性都是null
  • 第一次拜访BO属性(非ID属性)时,Hibernate会执行select+初始化代理类实例
    每日一道理
漫漫人生路,谁都难免会遭遇各种失意或厄运。在凄风苦雨 惨雾愁云的考验面前,一个强者,是不会向命运低头的。风再冷,不会永远不息;雾再浓,不会经久不散。风息雾散,仍是阳光灿烂。

    ——若select查不到,则抛ObjectNotFoundException

    ——getId()其实不能触发查询。

    这种延迟初始化可以节省数据库查询,进步性能。

    

    

当对象找不到时的行为不同

    如果在缓存和数据库中都找不到对象,则:

    get返回null;

    load抛出ObjectNotFoundException。

    

    

拜访数据库

    get总是拜访数据库;

    load其实不总是拜访数据库。——getId不拜访

    

    

代理

    get要么返回null,要么返回一个完整初始化的对象;

    load返回proxy。

    

    

性能

    load性能更高。

    

    

应用场景

    当想判断实例是否存在时,用get;——因为不存在的话,就会返回null

    当确信实例确定存在时,用load

    

    如果只需拜访对象ID,用load

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

文章结束给大家分享下程序员的一些笑话语录: 据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。
硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。”
项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”

posted @ 2013-05-22 22:03  xinyuyuanm  阅读(186)  评论(0编辑  收藏  举报