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=