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)本质上就是代理模式的应用。


  • 相关阅读:
    Java类对象转json字符串,servlet或js的json字符串转json对象或数组
    大三下每周总结--第一周
    阅读架构漫谈九篇博客有感-1500字
    大三上寒假15天--第15天
    大三上寒假15天--第14天
    大三上寒假15天--第13天
    jenkins+appium android app自动化测试
    windows jenkins 卸载
    jenkins运行Python
    pytest+jenkins安装+allure导出报告
  • 原文地址:https://www.cnblogs.com/hq-123/p/5840453.html
Copyright © 2011-2022 走看看