hibernate 抓取策略

 

1.单端代理(对端是One,即many2one):

   1.1 在用many2one时,fetch可以采取select或者join.

          * 用select时,会另发一条语句加载关联对象。

          * 用join时,用一条语句就查上来,相当于数据库里面的连接,内连接外连接取决于外键是否允许为空。

 

注意:这个规则仅适用于get或者load时,对HQL没有任何作用,即依然是会另发一条语句。

 

2.集合代理(对端是集合,即one2many)

2.1 这里fetch有3种取值:select,join,subselect

      * select,join和单端代理的一样,只影响load和get,对HQL无用。

      * 而subselect对get和load无效,对HQL有效。即用subselect,get和load还是另发一条语句,而HQL却是一下子查出来(比如select * from students where classid in (select * from classes))

 

 3.批量抓取(主要是用在many2one,或者one2many中的多的一方,加上一个batch-size=5)

     * 用在多的一端,假设many2one当中,50个学生对应50个不同班级,那么查询50个学生后,就得再查50次,才能将50个班级查出来,而如果在学生上加上batch-size=10,那么只要查50/10=5次就可以将班级全部查出来,用的是sql中的in原理。

 

 ------------------------------------------------------------

join和join fetch的区别:

join对load,get有效,对hql无效。

join fetch一般对hql有效。

 

你可能感兴趣的:(Hibernate)