Hibernate中Session.get()方法和load()方法的详细比较
"Hibernate中Session.get()方法和load()方法的详细比较" Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,如果代理对象被调用时没有数据存在,则抛出org.hibernate.ObjectNotFoundException异常。 从缓存机制上看,get()方法和load()方法都先到缓存(session缓存/二级缓存)中去查找,如果没有则执行不同的操作。get()方法如果没有找到缓存则直接到DB中查询,而load()方法则返回一个代理对象,不马上到DB中去找,等后面使用这个代理对象操作的时候,才到DB中查询。这就是我们常说的load在默认情况下支持延迟加载(lazy)。 从查询数据库的角度看,get()方法和load()方法也存在着区别。如果查询不到数据,get()方法返回null,不会报错,而load()方法则报错ObjectNotFoundException。使用get()方法去查询数据,会立即向DB发出查询请求,而使用load()方法查询数据,则返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select,直到程序员使用查询结果的时候才真的发出select。 在结合缓存技术的比较中,我们可以看到get()方法和load()方法的区别。get()方法在查询的时候首先到一级缓存(session级缓存)中查找,没有的话进入二级缓存(介于内存与硬盘之间),如果二级缓存还没有则直接进入数据库中查询!load()方法在查询的时候也是先到一级缓存中查找,如果找到则不会查询数据库,如果找不到则依次到二级缓存查找,如果二级缓存中没有查找的数据,get方法会根据是否要立即利用查询的结果,如果不利用的话则停止查找。 深入到get()方法和load()方法的根本区别,我们可以看到,get()方法确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。load()方法则认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用代理来延迟加载该对象。 get()方法和load()方法有着不同的设计理念和使用场景。get()方法更适合于不知道数据库中是否存在该记录的情况下使用,而load()方法则更适合于确定数据库中存在该记录的情况下使用。































- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 无线远程视频监控系统方案.doc
- 项目管理的要素.doc
- 月19日机组热态启动送轴封抽真空总结.docx
- 地埋管换热系统施工方案f.doc
- 第一章--实验一--研究匀变速直线运动.ppt
- 电气自动化混合液大学本科方案设计书完整免费版3.doc
- 秋娃娃的礼物(美术).doc
- 钢索配管、配线.doc
- 某工程单层钢结构安装施工工艺.doc
- 在Excel工作表中插入内置页眉和页脚.doc
- 21、项目管理机构资格认证书办件流程图.doc
- [山东]电力工程站内临建道路工程施工方案.doc
- 大口径玻璃钢夹砂管顶管施工的接头技术p.doc
- 公开招标管理办法.doc
- 造价员年底工作总结范本(直接套用).doc
- AutoCAD规划图库管理系统设计方案与实现.doc


