zoukankan      html  css  js  c++  java
  • Hibernate(九)--N+1问题

    1、在利用Hibernate操作数据库的时候,如果在实体类上设置了表的双向关联.这可能会出现Hibernate N+1的问题.

            1.1、一对多: 

                       在一方,查找得到了 n 个对象,那么又需要将 n 个对象关联的集合取出,于是本来的一条 sql 查询变成了 n+1 条;

             1.2、多对一: 

                      在多方,查询得到了 m 个对象,那么也会将 m 个对象对应的 1 方的对象取出, 也变成了 m+1 ;

    2、关于Hibernate N+1的解决方法

    2.1 延迟检索策略能避免多余加载应用程序不需要访问的关联对象

    Hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性)时才会发生查询动作。

    2.2迫切左外连接检索策略则充分利用了SQL的外连接查询功能,能够减少select语句的数目

    可以在映射文件里面配置下面的抓取策略

     
    <set name="ordes" fetch="join">
     
      <key column="customer_id" />
     
      <one-to-many class="Order" />
     
    </set>

      fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
      而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
      如果你的关联对象是延迟加载的,它当然不会去查询关联对象。
      另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。

  • 相关阅读:
    flash中网页跳转总结
    as3自定义事件
    mouseChildren启示
    flash拖动条移出flash无法拖动
    需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
    Teach Yourself SQL in 10 Minutes
    电子书本地转换软件 Calibre
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes – Page 31 练习
  • 原文地址:https://www.cnblogs.com/crazy-lc/p/12245223.html
Copyright © 2011-2022 走看看