一、什么是抓取策略
*Hibernate如何获取主体对象的关联属性的策略。
*抓取策略可以在ORM映射文件中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明
二、分类
*查询抓取(fetch=“select”)
当关联属性为延迟加载时,如需加载将另外发送一条SELECT语句抓取当前对象的关联实体或集合。
<many-to-one name="dept" class="Dept" fetch="select"> 默认为select,有join可选
测试代码:
Employee emp=(Employee)session.get(Employee.class, 1001);
Dept dept=emp.getDept();
System.out.println(dept.getDept_name());
注:上述代码中,当调用get方法时,发送一条查询emp的sql语句,而关联属性Dept没有加载出来,即没有发送sql语句查询,当我调用Dept的非主键属性时发送了一条sql语句查询Dept。
*连接抓取(fetch=“join”)
当在关联属性映射中将fetch设置为join时,在执行get()和load()方法时Hibernate会通过内连接立即获取关联属性。此时会导致关联属性的延迟加载失效(仅仅针对get和load方法,对HQL和Criteria无效)。
<many-to-one name="dept" class="Dept" fetch="join"> 默认为select,有join可选
测试代码:
Employee emp=(Employee)session.get(Employee.class, 1001);
Dept dept=emp.getDept();
System.out.println(dept.getDept_name());
Hibernate:
select
employee0_.e_no as e_no1_1_0_,
employee0_.e_name as e_name2_1_0_,
employee0_.e_gender as e_gender3_1_0_,
employee0_.e_job as e_job4_1_0_,
employee0_.e_salary as e_salary5_1_0_,
employee0_.hireDate as hireDate6_1_0_,
employee0_.dept_no as dept_no7_1_0_,
dept1_.d_no as d_no1_0_1_,
dept1_.d_name as d_name2_0_1_,
dept1_.d_location as d_locati3_0_1_
from
EMPLOYEE employee0_
left outer join
DEPT dept1_
on employee0_.dept_no=dept1_.d_no
where
employee0_.e_no=?
*子查询抓取(fetch=“subselect”)
当获取集合关联属性时,另外发送一条查询语句或者子查询语句抓取集合关联属性。此设置针对HQL语句同样有效。
<set name="emp" inverse="true" fetch="subselect"> fetch默认为select,还有join、subselect可选
测试代码:
Dept dept=(Dept)session.get(Dept.class, 10);
Set<Employee> emps=dept.getEmp();
int count=emps.size();
注:上述代码中,当我调用size方法时,发送一条sql语句查询主题对象的关联属性Set
*批量抓取(batch-size="")