一、延迟加载(真正使用这个对象的属性的时候才会发送SQL语句查询)
延迟加载(lazy又称懒加载)是Hibernate关联关系对象的默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来。所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
通常,将延迟加载分为两类:一类叫做类级别延迟,一类叫做关联级别延迟。
1.类级别查询
类级别延迟指的是,在查询某个对象的时候,是否采用延迟加载策略,这个通常在<class>标签上配置lazy属性
如果不想使用延迟加载,可以采用如下方法
(1)在类的映射文件上将lazy属性设置为false
<class name="com.mark.demo.User" table="t_user" lazy="false">
(2)将这个持久化类改为final修饰(无法生成代理类,就会使延迟加载失效)
注意:使用懒加载时要确保,调用属性加载数据时,session还是打开的,不然会抛出异常
2.关联级别查询
关联级别延迟指的是,在查询一个对象的关联对象时,是否采用延迟加载策略,这个通常在<set>或<many to one>上配置lazy属性
Customer customer = session.get(Customer.class,2L);
Set<Linkman> linkmans = customer.getLinkmans(); //是否采用延迟加载
通过客户查询其关联的联系人对象,在查询联系人的时候是否采用延迟加载称为是关联级别的延迟,关联级别的延迟通常是在<set>和<many-to-one>上来进行配置
(1)set标签
<set>标签上lazy取值
1) true :默认值,采用延迟加载
2) false :检索关联对象的时候,不采用延迟加载
3) extra :及其懒惰,与懒加载基本一致,如果获得集合的size,只查询集合的size(count语句)
(2)many-to-one标签
<many-to-one>标签上lazy取值
1) proxy :默认值,是否采用延迟取决于另一方类上的lazy属性
2) false :检索关联对象的时候,不采用延迟加载
3) no-proxy
二、抓取策略(通过控制查询其关联对象时,需要发送SQL语句)
抓取策略指的是查询到某个对象的时候,如何抓取其关联对象。这个通常在<set>或<many to one>上配置fetch属性
1.set标签
<set>标签上fetch取值
1) select : 默认值,发送一条普通的select语句查询(单表查询)
2) join : 发送一条迫切左外连接查询(多表查询)
3) subselect : 发送一条子查询语句查询其关联对象
2.many-to-one标签
<many-to-one>标签上fetch取值
1) select : 默认值,发送一条普通的select语句查询(单表查询)
2) join : 发送一条迫切左外连接查询(多表查询)
这样来看在set上配置fetch有3个值,lazy有3个值,这样就会产生很多种效果
注意:当fetch如果设置为join,lazy就会失效
结论:为了提高效率,fetch的选择上应选择select,lazy的取值应选择 true,全部使用默认值
3.批量抓取
在同时查询多个对象的关联对象的时候,可以采用批量抓取进行优化,可以通过在<set>标签中配置batch-size属性
<set name="linkmans" batch-size="3">
这样的话,在执行过程中一条SQL查询语句会直接将3个与客户关联的联系人一起查询出来
如果我们要实现查询多个联系人的时候,批量抓取联系人对应的客户对象时,我们可以在客户一端的<class>上配置batch-size
<class name="Customer" table="cst_customer" batch-size="3">