zoukankan      html  css  js  c++  java
  • Hibernate检索策略之延迟加载和立即加载


    延迟加载:延迟加载(lazy load懒加载)是当在真正需要数据时,才执行SQL语句进行查询。避免了无谓的性能开销。

    延迟加载分类:

       1.类级别的查询策略

      2.一对多和多对多关联的查询策略

      3.多对一关联的查询策略


    什么情况下使用延迟加载?

      如果程序加载一个对象的目的是为了访问它的属性,可以采用立即加载。如果程序加载一个持久化对象的目的是仅仅为了获得它的引用,可以采用延迟加载

    如何配置延时加载?

      在Hibernate中通过对.hbm的lazy属性来赋值,不同位置出现lazy的作用和取值也是不同的。

    步骤如下:

    1.类级别的查询策略:

      类级别可选的加载策略包括立即加载和延迟加载。默认为延迟加载。如果<class>元素的lazy属性为true。表示采用延迟加载;如果lazy属性为false,表示采用立即加载

      以Emp和Dept为例:

      在Dept.hbm.xml中的<Set>元素中添加属性 lazy="false" 表示立即加载

      测试类:

        @Test
        public void oneTest(){
            Dept dept=(Dept)session.load(Dept.class, 1);
            //lazy  true/false  类级别
            System.out.println(dept.getDeptName());

     load()方法在Id属性和getClass(),都已经储存到内存中,不用请求数据库,其他属性都需请求。


    2.一对多和多对多关联的查询策略

      如果对象中存在其他实体的集合则需要在hbm文件中配置set元素来进行表间的映射,而 在set元素中也可以添加lazy强延时加载。

      set元素中lazy有三个值,false(非延时加载),true(延时加载),extra(加强延时加载)。

        区别:这个策略能在进一步的帮我延迟加载这个对象,也就是代理对象的初始化时机。

      测试类:

    设定lazy属性为extra,实现效果:

    解析:第一条sql到数据库进行检索部门信息,随即加载出Dept对象

       第二条sql进行一个员工总记录获取,并没有加载Emp对象,他和lazy为true加载的时机不同。


    3.多对一关联的查询策略

    <many-to-one>元素用来设置多对一关联关系。lazy属性: 默认值为proxy,proxy:延迟加载no-proxy:无代理延迟加载false:立即加载。

    测试类:

    设定lazy为proxy,运行结果为:


    总结:

    Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hibernate通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。Hibernate 的延迟加载(lazy load)本质上就是代理模式的应用。


  • 相关阅读:
    8-16 不无聊序列 non-boring sequences uva1608
    8-8 Ddfense Line uva1471 优先级队列
    8-12 Erratic Expansion uva12627
    8-4 Fabled Rooks uva11134
    8-10 Coping Books uva714
    8-13 Just Finish it up uva11093
    8-11 Add All uva 10954
    8-2 Building for UN Uva1605
    css定位.py
    处理HTML5视频播放.py
  • 原文地址:https://www.cnblogs.com/hq-123/p/5840453.html
Copyright © 2011-2022 走看看