抓取策略:
什么是抓取策略? 即拥有了一个实体对象,想要得到它的关联对象的策略
什么是批量抓取策略? 即拥有了一批实体对象,想要得到这批实体对象的关联对象的策略
---------------------------------------------------------------------------------
在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集合标签上定义)
【第二条查询语句根据第一条查询语句来生成】