懒加载分为三种情况:类的懒加载,集合的懒加载,manytoone的懒加载
懒加载是针对从数据库查询数据的性能而言
性能
lazy
需要数据的时候才要加载(懒加载(优化的一种方式 )即延迟加载----用谁就加载谁)
类的懒加载
注意:查询是不要开启事物的
根据主键提取数据有session.get(.....)/session.load(*.class,1L)
调试时,箭头指向的代码,代表这句代码开始执行,跳到下一句,才代表上一句代码执行完成
session.load方法产生的是代理对象,该代理类是持久化类的子类
所谓懒加载,也就延迟加载,也是一种优化,上面当执行完load所在的一句代码,classes变量还并没有得到值,什么时候需要,就什么时候把查出来的Classes对象给classes变量,比如:上面需要classes.getName()属性,此时执行这句同时前马上就会执行一条查询1L这个对象的sql语句把值赋给classes变量,否则没有这句classes.getName(),Classes对象查询出来会延迟到关闭session,即关闭与数据库的连接,不得不把该Classes对象查询出来
laze=”false”就没有懒加载机制,下面标记部分执行完,就会执行查询数据库的语句,classes变量就会有值,后面的能够得到name属性值,不会报,no sesion错
集合的懒加载
/**
* 集合的延迟加载
* <set lazy="true">
*/
public void testCollection_Lazy_true(){
Session session = sessionFactory.openSession();
Classes classes = (Classes)session.get(Classes.class, 1L);
Set<Student> students = classes.getStudents();//发出加载Classes sql语句
for (Student student : students) {//发出加载学生的sql语句
System.out.println(student.getName());
}
session.close();
}
set的延迟加载:
true
false
extra
说明:
1、因为延迟加载在映射文件设置,而映射文件一旦确定,不能修改了。
2、延迟加载是通过控制sql语句的发出时间来提高效率的。
当lazy=”extra” 执行sql语句更高
/**
* select
count(sid)
from
Student
where
cid =?
2
*/
@Test
public void testCollection_Lazy_extra(){
Session session = sessionFactory.openSession();
/**
* 加载了classes又加载了student
*/
Classes classes = (Classes)session.get(Classes.class, 1L);
Set<Student> students = classes.getStudents();
System.out.println(students.size());
session.close();
}
manytoone的懒加载
对于性能来说,没有什么影响,所以随便怎么样都行