hibernate get/load 懒加载 fetch

来源:互联网 发布:武钢裁员5万人 知乎 编辑:程序博客网 时间:2024/05/27 09:46

hibernate 的get/load区别,懒加载,fetch的概念以前老是并不清楚。现在总结一下,发现它们不是一个单独的概念,是有联系的。
一 get/load 的区别
1、查询过程
get 先查询一级缓存(session缓存),再查询二级缓存,如果没有查询到再查询数据库(在这一步发出sql语句)。
load 先查询一级缓存(session缓存), 如果没有则生成代理对象,代理对象的initialized属性为false,target属性为null,如果访问代理对象的属性(在这一步发出sql,initialized修改为true,target修改为真实对象),访问对象属性(除id外)的时候发出sql
2 、从返回结果
get方法检索不到的话会返回null,load方式检索不到的话会抛 org.hibernate.ObjectNotFoundException异常
get 方法返回的是实体对象(如果session缓存中有代理对象,则返回代理对象), load方法返回的是代理对象
3、get/load是否有效和lazy的配置有关,下面在懒加载机制中会详细介绍
4、load方法实际是用的单个对象的懒加载。
二 懒加载
1、实体对象的延迟加载 lazy=”true/false”
要想在实体对象使用懒加载,必须在配置lazy=“true”(默认)和同时使用load 方法
如果配置lazy=”false”,load方法会失效。
当访问对象属性时发出sql
2、集合类型的延迟加载 lazy=”true/false/extra”
配置lazy=”true”
一, 集合对象的延迟加载 还分为两种情况
1,如果是通过load/get得到单个对象,则查询多方的sql 在get对象的集合属性时发出
2、如果是通过find到一方的集合,在遍历一方集合中,拿出一方的一个对象直接get集合属性不会发出sql
必须在开始遍历这个集合时才发出sql
三 fetch的用法
fetch有两个取值select/join, fetch的作用是在一对多的关系中,是通过多条select语句查询一方(N+1此),还是通过连接查询一次性获得多方数据(1次)
注意:在xml中配置的fetch对程序的HQL语句无效
fetch=join 后懒加载失效(一条语句就全部查询出来了)

0 0
原创粉丝点击