hibernate中的赖加载,抓取策略,批量抓取

本文深入探讨Hibernate中的懒加载机制,包括类级别的懒加载配置及使用方法,关联级别的懒加载策略和抓取策略,并介绍了批量抓取的方法以提高查询效率。

类别级的赖加载:在持久化类的配置文件中,类标签<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();

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值