Hibernate懒加载机制(转)

原文来源:http://blog.csdn.net/zhang6622056/article/details/7694176

                  http://superleo.iteye.com/blog/243322/

 

在关系模型的对应关系中一对一、一对多、和多对多。都已经做了相关案例Hibernate在提供这些查询的时候它有一种懒加载的机制。比如:  之前我们举例的一对一的案例Person-Idcard。如果我们只查询person那么会不会查询Idcard呢? 

 

public class Person {  

    private int id;  

    private String name;  

    private IdCard idcard; 

}  
 

 

毕竟Idcard也是Person类的一个属性。如上面的代码: 

如果我们查询一个person我们只是用到了这个person的name属性。而用不到它关联的idcard部分。那么我们就可以在配置文件中设置lazy=”true”的一个选项。如下面的代码: 

 

<hibernate-mapping   

    package="cn.hibernate.model">  

    <class name="Person" table="person">  

      <id name="id">  

          <generator class="native" /> 

        </id>  

        <property name="name" column="name"/>  

        <!-- 一对一的对象关系描述 -->  

        <one-to-one name="idcard" lazy="false"/>  

    </class> 

</hibernate-mapping>
 

 

当懒加载开启的时候那么我们查询person对象不会去查询相应的Idcard。只有在我们用person对象的get方法调用idcard对象的时候才会执行查询。这样就提高了效率。  

   

举例sql说明: 

下面的这些代码只是查询Emp员工对象。   

 

   s = HibernateUtil.getSession();  

   Employee emp = (Employee) s.get(Employee.class, 2);  
 

 

懒加载开启: 

只输出一句sql: 

select employee0_.id as id2_0_, employee0_.empname as empname2_0_, employee0_.dept_id as dept3_2_0_ from employee employee0_ where employee0_.id=? 
 

 

懒加载未开启: 

输出两句查询sql: 

Hibernate: select employee0_.id as id2_0_, employee0_.empname as empname2_0_, employee0_.dept_id as dept3_2_0_ from employee employee0_ where employee0_.id=?  
Hibernate: select dept0_.id as id1_0_, dept0_.deptname as deptname1_0_ from dept dept0_ where dept0_.id=? 
 

注意:  懒 加载的对象是代理对象,getId是不用访问数据库的。另外getClass得到的也是一个代理对象。只有get其他属性的时候才会访问数据库。 Session的load方法可以懒加载。然后用Hibernate.initialize(proxyObj)load方法实例化该代理对象。    懒加载通过asm和cglib包实现。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值