一、延迟加载lazy loading
延迟加载机制是为了避免一些无谓的性能开销而开发出来的,当数据真正要被调用的时候才会加载
二、Hibernate中对以下内容提供了延迟加载策略
1、实体对象的延迟加载
如下:
public void testClassLazyTrue(){
Employee emp=(Employee)session.load(Employee.class, 1001);
System.err.println(emp.getEname());
}
注:需要注意的是,实体对象的延迟加载策略,只对Session的load方法有效。上述代码中,lazy属性设置为true,表示要延迟加载,当我调用load方法时控制台没有打印sql语句,而当我调用对象的非主键属性时才会发送sql语句。如果lazy属性设置为false时,当调用load方法时直接发送sql语句,当调用对象的非主键属性时就不再发送sql语句了
2、集合类型的延迟加载
集合标签中lazy属性:true、fasle和extra,默认值为true
如下:
public void testSetLazyTrue(){
Dept dept=(Dept)session.get(Dept.class, 10);
Set
for (Employee employee : emps) {
System.out.println(employee.getEname());
}
}
注:上述代码中lazy设置为true,当我调用get方法时发送一条查询dept的sql语句,而不会发送查询emp的sql语句,当调用employee的非主键属性时才发送sql语句。而当lazy设置为false时,当调用get方法时发送了两条sql语句,既查询了dept又查询了关联对象employee。
另:
当lazy属性设置为extra时,除了有延迟加载的功能,还为集合的操作提供了更加智能化的功能实现
如:
public void testSetLazyExtra(){
Dept dept=(Dept)session.get(Dept.class, 10);
System,out.println(dept.getSet().size());
}
注:当我调用集合的size方法时,并没有发送sql语句查询所有的关联属性员工的信息,而是发送了一条类似于select count(*) from emp where deptno=?的语句,并没有加载集合中的元素,只是做个计数,这是对sql语句的优化。
3、单端延迟加载
这里不做过多代码演示,Hibernate延迟加载机制是为了提高Hibernate执行效率和程序的执行效率的,而有时需要立即加载数据,可以通过以下两个方法实现,
1、可通过fetch方式
Query query=session.createQuery("from Employee e left join fetch e.dept");
2、通过Hibernate类提供的initialize(Object proxy)立即加载延迟对象
Dept dept=session.get(Dept.class,10);
Hibernate.initialize(emp.getEmps());
4、普通属性延迟加载