Hibernate之抓取策略(关联查询优化)

一、延迟加载(真正使用这个对象的属性的时候才会发送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"> 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值