no-session问题
Hibernate.
initialize
(obj);立即加载
解决方法一:(在配置set中)
lazy:数据加载策略,可取值如下
false:立即加载关联数据
使用的是:两次查询!
proxy:懒加载,以代理对象的方式进行延迟加载,默认值
no-proxy:懒加载,
该方式在编译时需要进行
字节码增强,否则和
proxy没区别,很少使用
解决方法二:
(在配置set中)
fetch:抓取数据,可取值如下
join:立即加载,使用联接查询
使用的是:一次查询!!
注:此时会
lazy配置无效,总是会立即加载关联数据,使用联接查询
select:
懒加载,会再执行一次
selecg查询,默认值
N+1问题
在一方,查找得到了 n 个对象,那么又需要将 n 个对象关联的集合取出,于是本来的一条 sql 查询变成了 n+1 条;
这样造成了效率底下且影响性能。
解决方法:
1.延迟加载策略 :lazy=“true” (需要查找班级的学生时才查找,但还是产生了n+1次select查询,这时可以使用二级缓存在二次查询的时候就可快速直接从缓存中得到第一次查找的数据)。
2.迫外左连接查询:select c from class c left join class.students s on class.students.classId = class.classId;(减少了select查询次数,提高了数据库的查询效率,可以通过where条件语句控制得到所想要的student的数量)。
3.fetch=“join”直接关联的立即检索抓取到班级相关的student对象的数据。(优点:减少了select语句的查询。弊端:每次都进行大量的student抓取,如果关联的student很多则会产生过多的数据查询影响数据库的性能)
。