学习之路-Hibernate延迟加载

一、延迟加载lazy loading

延迟加载机制是为了避免一些无谓的性能开销而开发出来的,当数据真正要被调用的时候才会加载

二、Hibernate中对以下内容提供了延迟加载策略

1、实体对象的延迟加载

标签中lazy属性:true和false,默认为true

"Employee" table="employee" lazy="true"> 设置lazy属性

如下:

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

  设置lazy属性

如下:

public void testSetLazyTrue(){
Dept dept=(Dept)session.get(Dept.class, 10);
Set emps=dept.getEmp();
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、单端延迟加载

定义lazy属性:false、proxy和noproxy。默认为proxy

这里不做过多代码演示,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、普通属性延迟加载属性:true和false  单需要类增强

你可能感兴趣的:(Hibernate)