您的位置:首页 > 职场人生

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

2008-04-20 11:43 435 查看
假设存在实体 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: