Hibernate使用批量抓取技巧

大家都知道Hibernate可以充分有效的使用批量抓取,也就是说,如果仅一个访问代理(或集合),那么Hibernate将不载入其他未实例化的代理。

Hibernate批量抓取是延迟查询抓取的优化方案,你可以在两种Hibernate批量抓取方案之间进行选择:在类级别和集合级别。

类/实体级别的批量抓取很容易理解。假设你在运行时将需要面对下面的问题:你在一个Session中载入了25个Cat实例,每个Cat实例都拥有一个引用成员owner, 其指向Person,而Person类是代理,同时lazy="true"。

如果你必须遍历整个cats集合,对每个元素调用getOwner()方法,Hibernate将会默认的执行25次SELECT查询,得到其owner的代理对象。这时,你可以通过在映射文件的Person属性,显式声明batch-size,改变其行为:

<class name="Person" batch-size="10">...</class> 

随之,Hibernate将只需要执行三次查询,分别为10、10、 5。

你也可以在集合级别定义批量抓取。例如,如果每个Person都拥有一个延迟载入的Cats集合,现在,Sesssion中载入了10个person对象,遍历person集合将会引起10次SELECT查询,每次查询都会调用getCats()方法。如果你在Person的映射定义部分,允许对cats批量抓取, 那么,Hibernate将可以预先抓取整个集合。

请看例子:

<class name="Person"> 



    <set name="cats" batch-size="3"> 



        ...  



    </set> 




</class> 

相关推荐