您的位置:首页 > 其它

Hibernate初探【3】Session中get()和load()的区别

2016-05-20 21:19 351 查看
准备测试数据(三条)



1、get()方法直接返回实体类,如果查不到数据则返回null。load()会

返回一个实体代理对象(当前这个对象可以自动转化为实体对象),

但当代理对象被调用时,如果没有数据不存在,就会抛出个

org.hibernate.ObjectNotFoundException异常



load得到的代理对象还没有使用,所以还没有被实例化,因此没有报错

一旦使用,则抛出org.hibernate.ObjectNotFoundException异常



2.load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个

代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时

候,才到DB中查询,这就是我们常说的load在默认情况下支持延迟加

载(lazy)

load方法同样可以使用以下检验get方式检测

3. get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去

查(即马上发出sql)。总之,如果你确定DB中有这个对象就用

load(),不确定就用get()(这样效率高)

Employee e=(Employee) ss.get(Employee.class,3);
Employee ee=(Employee) ss.get(Employee.class,3);
两次查询,第一次将生成Hql语句,而第二次get将从hibernate缓存中进行查找

<img src="http://img.blog.csdn.net/20160520214104382?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-size:14px;" alt="" />
若两次get都是查询不存在的对象

Employee e=(Employee) ss.get(Employee.class,4);
Employee ee=(Employee) ss.get(Employee.class,4);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate