`
schy_hqh
  • 浏览: 543162 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate基于配置文件(十八)抓取策略,优化查询

 
阅读更多

抓取策略:
    什么是抓取策略? 即拥有了一个实体对象,想要得到它的关联对象的策略
    什么是批量抓取策略? 即拥有了一批实体对象,想要得到这批实体对象的关联对象的策略
---------------------------------------------------------------------------------
在many-to-one/one-to-one上面(多的一端,如ContactPerson)定义抓取策略

1个对象---关联对象
    单一对象--get()/load() ContactPerson
    -fetch="select" (缺省) 发出第二条语句,获取关联对象
    -fetch="join" 在加载第一个对象的时候就通过左外连接一并获取到关联对象,此时,懒加载机制失效!

批量抓取策略

1批对象(List集合)---关联对象
    批量对象---通过list()获取到的对象 List<ContactPerson>
    批量抓取的时候,fetch="join"无效,即不会进行外连接获取关联对象
   
    解决办法:
    为了提高性能,在对方实体类的class映射上配置batch-size,让hibernate根据这个值来分批抓取关联对象
    避免发出大量的查询语句
    即在"一的那端"(如Group)的配置文件的class标签中设置  batch-size=n
    一次加载n个关联对象,而不是一次只获取一个
----------------------------------------------------------------------------------
在集合(one-to-many/many-to-many)上面定义抓取策略   Group--Set<ContactPerson>

1个对象---关联对象
    -fetch="select" 缺省,第二条查询才能获取到关联对象
    -fetch="join"   使用外连接一并查询出关联对象 ,lazy失效
    -fetch="subselect"  专门用于批量抓取,其它情况使用无效(单一对象使用无效,必须是集合类型)
   
批量抓取策略---    List<Group>

1批对象(List集合)---关联对象
    -fetch="join"无效
    -fetch="select" + batch-size=n 分批抓取关联对象(set集合标签上定义)
    -使用fetch="subselect" 通过子查询一次性查询出所有关联对象(set集合标签上定义)
        【第二条查询语句根据第一条查询语句来生成】


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics