类别级的赖加载:在持久化类的配置文件中,类标签<class>的lazy属性配置
/**
* session.get(): 立即加载.执行方法时立即发送sql语句查询结果
* session.load():赖加载,到使用该方法返回的对象时, 才会执行sql查询
* session.load()赖加载是否生效,可以在配置文件的Customer的类标签后面 加属性:
* lazy="false" 关闭赖加载,该属性默认为true。
* 使用懒加载session.load()实际返回的是代理对象,代理对象中新加了handler属性
*/
public void fun1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer c = session.load(Customer.class, 5l);
System.out.println(c);//赖加载在这里使用的时候才会 实际执行sql语句
tx.commit();
session.close();
}
关联别级的懒加载和抓取策略:
关联别级的懒加载策略:在持久化类的映射文件配置<set>标签和<many-to-one>标签的lazy属性.
抓取策略是指:通过一个持久化对象,去获取另一个他关联的持久化对象(自己的成员变量)的查询方式(普通查询,迫切左外链接,子查询).在映射文件中通过<set>和<many-to-one>标签的fetch属性来配置.
代码:
public void fun(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer c = session.get(Customer.class, 2l);
Set<LinkMan> linkMens = c.getLinkMens();//关联级别
System.out.println(linkMens.size());//测试及其赖加载
System.out.println(linkMens);//测试赖加载
tx.commit();
session.close();
}
<set>:标签lazy属性有三种取值
true:默认,赖加载
false:不采用赖加载
extra:及其赖加载,与懒加载效果基本一致.当只获得集合的size.只发出count查询语句
<set>:标签fetch属性有三种取值:
select:默认值,发送普通的select查询语句
join:发送迫切左外链接查询语句,如配置该值,set标签的lazy失效,会立即查询
subselect:发送子查询,查询关联语句
<many-to-one>:标签lazy属性有三种取值:
proxy:默认,取决于一的一方上的lazy属性值
false:不采用懒加载
no-proxy:
<many-to-one>:标签fetch属性有2种取值:
select:普通查询
join:迫切左外链接查询 lazy: 失效
批量抓取:
1.配置:batch-size属性
<set name="linkMens" batch-size="2">
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan"/>
</set>
2.测试代码
public void fun1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String hql = "from Customer ";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
System.out.println("List<Customer>大小是:"+list.size());
for(Customer c:list){
//默认情况,Customer每获取一次联系人会查询一次该Customer的所有联系人(c.getLinkMens()).
//<set>下配置 batch-size="2" ,会一次性查询2个Customer的所有联系人,大大减少sql查询次数
System.out.println("该Customer联系人有:"+c.getLinkMens().size()+"个 :"+c.getLinkMens());
}
tx.commit();
session.close();
}