SSH笔记-Hibernate的检索策略(lazy、fetch、batch-size)

1、分为两部分:
①类级别检索策略,大概了解检索策略(代码所在包com.demo.sshtest)
②检索策略的lazy、fetch、batch-size属性使用(代码所在包com.demo.sshtest2)

2、检索策略:
①立即检索,立即加载检索方法指定的对象
②延迟检索,延迟加载检索方法指定的对象,在使用具体属性值时,才进行加载(这个时候会执行查询语句)

3、检索策略使用场景:
①如果加载对象是为了访问他的属性,则使用立即加载
②如果加载对象目的是为了获得他的应用,则可以使用延迟加载

4、检索策略属性:
①lazy: 主要决定 orders 集合被初始化的时机. 即到底是在加载 Customer 对象时就被初始化, 还是在程序访问 orders 集合时被初始化
②fetch: 取值为 “select” 或 “subselect” 时, 决定初始化 orders 的查询语句的形式; 若取值为”join”, 则决定 orders 集合被初始化的时机,若把 fetch 设置为 “join”, lazy 属性将被忽略
③batch-size:批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能

5、一对多和多对多的检索策略,lazy和fetch取值对应策略
①lazy=true ——– fatch=默认 ——– 采用延迟检索
②lazy=false ——– fatch=默认 ——– 采用立即检索
③lazy=extra ——– fatch=默认 ——– 采用加强延迟检索(延迟对象集合初始化时机)
④lazy=true/false/extra ——– fatch=默认 ——– 根据lazy决定执行检索策略
⑤lazy=true/false/extra ——– fatch=subselect ——– 根据lazy决定执行检索策略
⑥lazy=默认 ——– fatch=join ——– 采用迫切左外连接策略

6、多对一和一对一的检索策略,lazy和fetch取值对应策略
①lazy=proxy ——– fetch=默认 ——– 采用延迟检索
②lazy=non-proxy ——– fetch=默认 ——– 采用无代理延迟检索(需要增强持久化类的字节码才能实现)
③lazy=false ——– fetch=默认 ——– 采用立即检索
④lazy=默认 ——– fetch=join ——– 采用迫切左外连接策略(比立即检索用更少select语句)


7、类级别检索策略
(1)Customer.java “一”端(因为关系配置有用set)

package com.demo.sshtest;

import java.util.HashSet;
import java.util.Set;

public class Customer {
   

    public Integer Id;
    public String cName;

    public Set<Merchant>merchant = new HashSet<>();

    public Integer getId() {
        return Id;
    }
    public void setId(Integer id) {
        Id = id;
    }
    public String getcName() {
        return cName;
    }
    public void setcName(String cName) {
        this.cName = cName;
    }
    public Set<Merchant> getMerchant() {
        return merchant;
    }
    public void setMerchant(Set<Merchant> merchant) {
        this.merchant = merchant;
    }

}

(2)Merchant.java “多”端

package com.demo.sshtest;

public class Merchant {

    public Integer merId;
    public String merName;
    public Integer getMerId() {
        return merId;
    }
    public void setMerId(Integer merId) {
        this.merId = merId;
    }
    public String getMerName() {
        return merName;
    }
    public void setMerName(String merName) {
        this.merName = merName;
    }

}

(3)Customer.hbm.xml 多端映射关系配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-4-12 22:01:32 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.demo.sshtest.Customer" table="CUSTOMER" lazy="true">
        <id name="Id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="cName" type="java.lang.String" access="field">
            <column name="CNAME" />
        </property>
        <set name="merchant" table="MERCHANT" cascade="save-update" order-by="ID DESC">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="com.demo.sshtest.Merchant" />
        </set>
    </class>
</hibernate-mapping>

(4)Merchant.hbm.xml “一”端映射关系配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-4-12 22:02:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.demo.sshtest.Merchant" table="MERCHANT">
        <id name="merId" type="java.lang.Integer">
            <column name=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值