【Hibernate】Hibernate中的get和load有何不同?

来源:互联网 发布:mac 安装hadoop 编辑:程序博客网 时间:2024/06/05 10:37

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

















原创粉丝点击