抓取策略(Fetching strategies)

Hibernate3 定义了如下几种抓取策略:

  • 连接抓取(Join fetching):Hibernate 通过在 SELECT 语句使用 OUTER JOIN(外连接)来获得对象的关联实例或者关联集合。

  • 查询抓取(Select fetching):另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。除非你显式的指定lazy="false" 禁止 延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条 select 语句。

  • 子查询抓取(Subselect fetching):另外发送一条 SELECT 语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定 lazy="false" 禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条 select 语句。

  • 批量抓取(Batch fetching):对查询抓取的优化方案,通过指定一个主键或外键列表,Hibernate 使用单条 SELECT语句获取一批对象实例或集合。

Hibernate 会区分下列各种情况:

  • Immediate fetching,立即抓取:当宿主被加载时,关联、集合或属性被立即抓取。

  • Lazy collection fetching,延迟集合抓取:直到应用程序对集合进行了一次操作时,集合才被抓取(对集合而言这是默认行为)。

  • "Extra-lazy" collection fetching,"Extra-lazy" 集合抓取:对集合类中的每个元素而言,都是直到需要时才去访问数据库。除非绝对必要,Hibernate 不会试图去把整个集合都抓取到内存里来(适用于非常大的集合)。

  • Proxy fetching,代理抓取:对返回单值的关联而言,当其某个方法被调用,而非对其关键字进行 get 操作时才抓取。

  • "No-proxy" fetching,非代理抓取:对返回单值的关联而言,当实例变量被访问的时候进行抓取。与上面的代理抓取相比,这种方法没有那么“延迟”得厉害(就算只访问标识符,也会导致关联抓取)但是更加透明,因为对应用程序来说,不再看到 proxy。这种方法需要在编译期间进行字节码增强操作,因此很少需要用到。

  • Lazy attribute fetching,属性延迟加载:对属性或返回单值的关联而言,当其实例变量被访问的时候进行抓取。需要编译期字节码强化,因此这一方法很少是必要的。



    one-to-many:

    <set name="emps" inverse="true" fetch="select" lazy="true|extra|false">
         <key>
               <column name="DEPTNO" precision="2" scale="0" />
         </key>
         <one-to-many class="org.han.entity.Emp" />
    </set>

    lazy=true:延迟加载

            false:即时加载

            extra:需要是才访问数据库


    many-to-one:

    <many-to-one name="dept" class="org.han.entity.Dept" fetch="select" lazy="proxy|no-proxy|false">
          <column name="DEPTNO" precision="2" scale="0" />
    </many-to-one>


    lazy=false:即时加载

            proxy:代理抓取

            no-proxy:通过编译期字节码增强操作延迟加载(不常用)


    lazy也可以用在类或属性上


            


你可能感兴趣的:(抓取策略(Fetching strategies))