数据库返回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测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”