抓取策略:
单端代理:
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">