zoukankan      html  css  js  c++  java
  • Hibernate 加载策略得总结

                                        Hibernate 加载策略得总结

    加载策略(优化查询):

    策略种类:
    延迟加载: 等到使用的时候才会加载数据.
    立即加载: 不管使用不使用,都会立刻将数据加载.
    策略的应用:
    类级别的加载策略.

    关联级别的加载策略


    ----------------------------------------------------------------------
    类级别加载策略:
    1. get/load
    get: 立即查询数据库,将数据初始化
    load:  hbm文件中,class元素的lazy属性绝对类级别load方法的加载策略
    true:先返回一个代理对象.使用代理对象的属性时,才去查询数据库.
    false: 与get一致,会立即加载数据

    ----------------------------------------------------------------------


    关联级别加载策略
    在查询有关联关系的数据时,加载一方的数据是否需要将另一方立即查询出.
    默认: 与我关联的数据,在使用时才会加载.
    集合(一对多):
    set 
    lazy: 是否对set数据使用懒加载
    true:(默认值) 对集合使用才加载
    false: 集合将会被立即加载
    extra: 极其懒惰,如果使用集合时,之调用size方法查询数量, Hibernate会发送count语句,只查询数量.不加载集合内数据.
    fetch : 决定加载集合使用的sql语句种类
    select: (默认值) 普通select查询
    join: 表链接语句查询集合数据
    subselect: 使用子查询 一次加载多个Customer的订单数据
    fetch lazy 结论
    ---------------------------------------------------------------- ----------------------------------
    select  true 默认值, 会在使用集合时加载,普通select语句
    select false 立刻使用select语句加载集合数据
    select extra 会在使用集合时加载,普通select语句,如果只是获得集合的长度,会发送Count语句查询长度.
    join true 查询集合时使用表链接查询,会立刻加载集合数据
    join false 查询集合时使用表链接查询,会立刻加载集合数据
    join extra 查询集合时使用表链接查询,会立刻加载集合数据
    subselect true 会在使用集合时加载,子查询语句
    subselect false 会在查询用户时,立即使用子查询加载客户的订单数据
    subselect   extra 会在使用集合时加载,子查询语句,如果只是获得集合的长度,会发送Count语句查询长度.
                ----------------------------------------------------------------------------------------------------------
    多对一:
    lazy
      false 加载订单时,会立即加载客户
      proxy 看客户对象的类加载策略来决定
      no-proxy : 不做研究. 
      fetch=
    select  : (默认值)使用普通select加载
    join : 使用表链接加载数据

    fetch lazy 结果
    ---------------------------------------------------
    select false 加载订单时,立即加载客户数据.普通select语句加载客户.
    select proxy 类加载策略为:lazy=false 同上
    lazy=true 加载订单时,先不加载客户数据.使用客户数据时才加载
    join false 使用表链接查询订单以及对应客户信息.lazy属性无效
    join proxy 使用表链接查询订单以及对应客户信息.lazy属性无效

    -------------------------------------------------------------------------------------------------------------------


    批量加载:
    set
    batch-size: 决定一次加载几个对象的集合数据. in 条件加载多个用户的订单.


    检索总结:(参考)

    检索策略

    优点

    缺点

    优先考虑使用的场合

    立即检索

    对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以从一个对象导航到关联的对象

    (1)select语句多

    (2)可能会加载应用程序不需要访问的对象,浪费许多内存空间。

    (1)类级别

    (2)应用程序需要立即访问的对象

    (3)使用了二级缓存

    延迟检索

    由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并节省内存空间。

    应用程序如果希望访问游离状态的代理类实例,必须保证她在持久化状态时已经被初始化。

    (1)一对多或者多对多关联

    (2)应用程序不需要立即访问或者根本不会访问的对象

    表连接检索

    (1)对应用程序完全透明,不管对象处于持久化状态还是游离状态,都可从一个对象导航到另一个对象。

    (2)使用了外连接,select语句少

    (1)可能会加载应用程序不需要访问的对象,浪费内存。

    (2)复杂的数据库表连接也会影响检索性能。

    (1)多对一或一对一关联

    (2)需要立即访问的对象

    (3)数据库有良好的表连接性能。

    延迟检索中注意

        Customer  Get(int id)

        Return Session.load(Customer.class,id);

            1. layz=false

            2. Service层获得在页面要上要用到的属性=> Service层中确保数据已经

    保证再session关闭时,取出对象数据。

  • 相关阅读:
    python 多线程实例
    手把手教你做酷炫的数据可视化大屏,零基础的你仅需6步
    化繁为简:数据库运维人员应该知道这些...
    凭什么它能成为报表神器?这五大技术硬货不得不服
    《算法图解》学习笔记(九):动态规划(附代码)
    前端布局总结(持续更新)
    前端布局总结(持续更新)
    前端布局总结(持续更新)
    前端布局总结(持续更新)
    linux之centos安装jdk以及nginx详细过程
  • 原文地址:https://www.cnblogs.com/meiLinYa/p/9222668.html
Copyright © 2011-2022 走看看