• Hibernate检索策略(抓取策略)(Hibernate检索优化)


    一、查询方法中get方法采用策略是立即检索,而load方法采用策略是延迟检索,延迟检索是在使用数据时才发送SQL语句加载数据

    获取延迟加载数据方式:1、使用的时候,如果Customer c=session.load(Customer.class,1);//加载id为1的客户,此时是延迟加载,返回的是代理对象,当使用的时候加载数据,如c.getName();

               2、调用Hibernate.initialize(c);方法,初始化对象,也可加载到数据

    二、类级别检索策略

    包括立即检索和延迟检索,即使用get和load方法,而Query查询的数据属于类级别检索中的立即检索

    可以在hbm.xml文件中的class节点配置lazy="false",这样load方法也变成立即检索了,和get方法一样了

    三、关联级别检索策略

    1、多对多与一对多,都是先得到一个再检索另一个,所以这两种情况一样

    在hbm.xml文件中set节点上设置fetch和lazy两个属性

    fetch可取值:join select subselect  fetch代表检索时语句方式

    lazy可取值:true false extra   lazy代表是否延迟

    (1)、如果fetch为join,则lazy失效,采用迫切左外连接

    (2)、fetch为select时,将生成多条简单SQL语句

        lazy=false,立即检索

        lazy=true,延迟检索

        lazy=extra,加强延迟检索(极其懒惰检索),比如查询关联类集合条数,则发送select count(*) from table

    (3)、fetch为subselect时,将生成子查询SQL语句,这时查询方法要用query.list().get

    使用Query查询数据时,自己编写hql语句,则fetch=join无效,关联集合将根据lazy设置进行加载

    2、一对一和多对一情形一样,都是由一个得到另一个

    在hbm.xml文件中many-to-one节点上设置fetch和lazy两个属性

    fetch可取:join select

    lazy可取:false proxy no-proxy

    (1)、如果fetch为join,则lazy失效,采用迫切左外连接

    (2)、fetch为select时,将生成多条简单SQL语句

        lazy=false,立即检索

        lazy=proxy,采用的检索方式为对方类级别检索方式,如订单查询客户是一对多,此时要采用customer.hbm.xml配置中class上配置的lazy检索方式

    使用Query查询数据时,自己编写hql语句,则fetch=join无效,关联集合将根据lazy设置进行加载

    结论:开发中能延迟则延迟,必须立即才立即(优化方案)

    四、批量检索,解决N+1查询问题

    N+1问题:如查询所有客户订单,首先查询出所有客户,而后根据每个客户id分别去查找订单,导致N+1问题

    其实质就是先查询所有客户,得到客户id,然后通过SQL的in语句来查询订单中客户id in(前门查出的id)中

    解决方案:在customer.hbm.xml文件中set节点设置batch-size属性,即,分批提取数据。如果共4个客户,设置值大于等于4会有两条SQL语句发出;如果设置小于4,则至少会有三条语句发出

    如果是通过订单查询客户解决N+1问题,而订单中没有set节点,就在客户hbm.xml配置文件的class节点配置batch-size(是查询客户,所以在客户class节点配置)

  • 相关阅读:
    win2003系统网络安装——基于linux+pxe+dhcp+tftp+samba+ris
    Linux系统网络安装——基于pxe+dhcp+nfs+tftp+kickstart
    写在前面
    windows下使用批处理设置环境变量
    使用广告终结者屏蔽页面的任意部分
    window7 输入什么命令可以快速打开服务管理?? 虚拟机设置了NAT网络连接方式,还是无法上网?
    [转]PHP100视频教程(2012-2013版)下载地址及密码
    窗口对象的方法 prompt() 用来输入数据
    HTML5 canvas标签绘制正三角形 鼠标按下点为中间点,鼠标抬起点为其中一个顶点
    javascript弹出框打印某个数值时,弹出NaN?(not a number)
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/5117612.html
Copyright © 2020-2023  润新知