面试常见问题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
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
相关文章推荐
- hibernate的持久化对象的状态,n+1问题和load和get方法区别
- 面试常见问题:java中wait()和sleep()方法的区别
- 常用代码块模板,get,load区别,session.get(,)参数解释,session方法总结
- Hibernate中get()和load()方法的区别
- Hibernate的load()、get()、list()、iterator()方法的区别
- Hibernate中get方法和load方法的区别
- Session.load()和get()方法区别
- Hibernate中get和load方法的区别
- Hibernate中get和load方法的区别
- hibernate的get、load的方法的区别,IllegalArgument异常
- hibernate Session的get和load方法区别
- Hibernate中get方法和load方法的区别
- 面试常见问题回答方法
- Hibernate中get和load方法的区别
- Hibernate中get和load方法的区别
- Hibernate中get和load方法的区别
- hibernate:get和load方法的区别
- hibernate对象关系映射“之”延迟加载之get、load方法的区别
- Session对象的load()方法和get()方法的区别
- Hibernate中get和load方法的区别