批量预抓取是不是只针对many-to-one那端才有效?
比如author与article,是-对多的关系,
是不是在article中的....
才有效?
还有它的应用场合在哪?就是在循环取文章的时候取作者?
[b]问题补充:[/b]
先谢了,蔡华江
我试过在set中使用batch-size,没有发挥作用!
还有你给出的例子当中,取出List students和获取每个students的class需要在同一个session上下文中才有效,这样会不会降低它使用的机会啊?[color=red]实际项目[/color]中像实现你这个例子的功能是用batch-szie多些还是用fetch="join"多些呢?或者其他方法?
四.hibernate 批量策略batch-size属性,可以批量加载实体类,
参见Classes.hbm.xml,同时集合也可以是使用,如:
在配置文件hbm.xml 设置中:
List students = session.createQuery(“select s from Student s where s.id in(:ids)”).setParameterList(“:ids”,new Object[]{1,11,21,31,41,51,61,71,81,91}).list();
for(Iterator iter=students.iterator();iter.hasNext();){
Student student = (Sutdent)iter.next();
System.out.println(student.getName());
System.out.println(student.getClassess().getName());
}
当第二个for循环时,每次加载 之前设置的 数量 实体对象, 如:现在设置3,那么当Iterator iter=students.iterator();iter.hasNext();时候,他会查询出3个student对象
使用批量抓取(Using batch fetching)
Hibernate可以充分有效的使用批量抓取,也就是说,如果仅一个访问代理(或集合),那么Hibernate将不载入其他未实例化的代理。 批量抓取是延迟查询抓取的优化方案,你可以在两种批量抓取方案之间进行选择:在类级别和集合级别。
类/实体级别的批量抓取很容易理解。假设你在运行时将需要面对下面的问题:你在一个Session中载入了25个 Cat实例,每个Cat实例都拥有一个引用成员owner, 其指向Person,而Person类是代理,同时lazy="true"。 如果你必须遍历整个cats集合,对每个元素调用getOwner()方法,Hibernate将会默认的执行25次SELECT查询, 得到其owner的代理对象。这时,你可以通过在映射文件的Person属性,显式声明batch-size,改变其行为:
...
随之,Hibernate将只需要执行三次查询,分别为10、10、 5。
你也可以在集合级别定义批量抓取。例如,如果每个Person都拥有一个延迟载入的Cats集合, 现在,Sesssion中载入了10个person对象,遍历person集合将会引起10次SELECT查询, 每次查询都会调用getCats()方法。如果你在Person的映射定义部分,允许对cats批量抓取, 那么,Hibernate将可以预先抓取整个集合。请看例子:
...
如果整个的batch-size是3(笔误?),那么Hibernate将会分四次执行SELECT查询, 按照3、3、3、1的大小分别载入数据。这里的每次载入的数据量还具体依赖于当前Session中未实例化集合的个数。
如果你的模型中有嵌套的树状结构,例如典型的帐单-原料结构(bill-of-materials pattern),集合的批量抓取是非常有用的。 (尽管在更多情况下对树进行读取时,嵌套集合(nested set)或原料路径(materialized path)(××) 是更好的解决方法。)