学习之路-Hibernate延迟加载

本文介绍了Hibernate的延迟加载机制,旨在提高性能。详细讲解了实体对象、集合类型、单端延迟加载的延迟加载策略,以及如何通过fetch和initialize方法实现立即加载。通过设置lazy属性,可以控制何时加载关联数据,从而优化SQL查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、延迟加载lazy loading

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

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

1、实体对象的延迟加载

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

<class name="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、集合类型的延迟加载

<set>、<List>集合标签中lazy属性:true、fasle和extra,默认值为true

 <set name="emp" inverse="true" lazy="true"> 设置lazy属性

如下:

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

<many-to-one>和<one-to-one>定义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、普通属性延迟加载<property>属性:true和false  单需要类增强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值