1.立即检索与延迟检索
当需要查询出一个对象的时候,立即检索会立刻发送SQL语句,而延迟检索则会在该对象被使用的时候才会发送SQL语句
a. 单张表的查询中,在class标签上设置lazy属性即可
false:不使用延迟加载
true :使用延迟加载
b. 一对多
设置fetch(SQL语句的形式,写法)和lazy(是否延迟加载)
对于一的一方:
fetch:join 那么不管lazy取何值,都是使用左外连接直接进行查询,就不涉及到延迟查询
fetch: select
lazy:false 那么再查询Customer的时候,Set<Order> orders 将会一起被查询出来,不过使用的是两条SQL语句而不是连接查询,即先查询Customer,再根据Customer的id查询Orders表
lazy:true 那么再查询Customer的时候,Set<Order> orders 将不会一起被查询出来,在需要使用order时才会发送SQL语句查询
lazy:extra 更加慵懒的模式,当查询出customer的时候,调用customer.getOrder.getSize(),那么发送的SQL语句将会是select count(*) from orders where id = ?
fetch: subselect 注意使用Query才会是使用子查询
lazy的属性的取值同上
对于多的一方
fetch:join,select
lazy:false,proxy,no-proxy
proxy:在many-to-one上设置,表示需不需要延迟加载取决于一的哪一方的class标签上lazy的属性值
2.批量抓取
在class标签上设置batch-size,表示一次可以查询几个该实例
<span style="white-space:pre"> </span> /*
* batch-size 根据Order集合查询Customer,在Customer的class上设置batch-size批量查询
* */
@Test
public void batch2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Order> list = session.createQuery("from Order").list();
for (Order order : list) {
System.out.println(order.getCustomer().getName());
}
tx.commit();
session.close();
}
/*
* batch-size
* */
@Test
public void batch(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Customer> list = session.createQuery("from Customer").list();
for (Customer customer : list) {
for (Order order : customer.getOrders()) {
System.out.println(order);
}
}
tx.commit();
session.close();
}
<class name="com.ywkj.domain.Customer" table="customer" batch-size="2">
</class>