标签:
方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远 只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用 过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数 据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
最后,我们分析下为什么网路上那么多关于二者区别的文章不太准确!首先可能是版本问题,Hibernate版本不同,运行机制不太一样;其次就是很 多朋友只是把自己经验所得与人分享,并没有经过全方位代码的检测;最后就是有些技术牛人,表达比较随意。所以我希望大家以后学习知识的时候不要盲从他人迷 信权威,一定要综合多方资料,比较和整理,再经过自己实践检验,这样得到的知识才是真实有效的。
第二篇
get加载方法:
两加载方法区别:
区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;
区别2:load支持延迟加载,get不支持延迟加载。
也就是说:
这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。
而:
则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。
注意:
上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。
区别:比较明显的是有无打印语句
标签:
原文地址:http://www.cnblogs.com/tian830937/p/4436024.html