hibernate抓取策略

抓取策略:

    

    单端代理:

       hibernate抓取策略,单端代理的批量抓取

                   设置fetch=”select”,如

              <many-to-one name="classes" column="classesid" fetch="select"/>

       fetch="select",另外发送一条select语句加载当前对象的关联对象或集合

       设置fetch="join",如:

<many-to-one name="classes" column="classesid" fetch="join"/>

fetch="join",hibernate会通过一个select语句连接(内联,此时many-to-one设置为非空/外联)抓取其关联对象或集合

fetch="join",那么lazy失效

fetch="join",只影响get和load,对hql没有影响

为了防止n+1问题可以采用预先抓取的策略,如:

select s from Student s join fetch s.classes

fetch为select或join不影响hql,它影响的是load,get方法

      

    集合代理:

       保持默认,同fetch="select",如:

<set name="students" order-by="id" inverse="true" cascade="all" fetch="select">

fetch="select",另外发送一条select语句加载当前对象的关联对象或集合

设置fetch="join",如:

<set name="students" order-by="id" inverse="true" cascade="all" fetch="join">

                   fetch="join",hibernate会通过一个select语句连接(内联/外联)抓取其关联对象或集合

fetch="join",那么lazy失效

fetch="join",只影响get和load,对hql没有影响

设置fetch="subselect",如:

<set name="students" order-by="id" inverse="true" cascade="all" fetch="subselect">

fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体的关联集合

fetch="subselect",不影响get.load,会影响hql查询

    批量抓取:

    batch-size属性,可以批量加载实体类,参见Classes.hbm.xml

<class name="com.bjpowernode.hibernate.Classes" table="t_classes" batch-size="10">

或者查询时使用fetch:

       List students = session.createQuery("select s from Student s join fetch s.classes  where s.id in(:ids)")

       .setParameterList("ids", new Object[]{1, 11, 21, 31, 41, 51, 61, 71, 81, 91})

       .list();

batch-size属性,可以批量加载实体类,参见Classes.hbm.xml

<set name="students" order-by="id" inverse="true" cascade="all" batch-size="3">

猜你喜欢

转载自free0007.iteye.com/blog/1769452