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