[转]hibernate抓取策略

原文:http://jiangxuwen7515.blog.163.com/blog/static/817523502010730481252/?fromdm&fromSearch&isFromSearchEngine=yes

一、
hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join

测试用例:

Student student = (Student)session.get(Student.class, 1);
System.out.println(student.getName());
System.out.println(student.getClasses().getName());

1)保持默认,同fetch="select",如:
<many-to-one name="classes" column="classesid"
fetch="select"/>

fetch="select",另外发送一条select语句抓取当前对象关联实体或集合

执行结果:2条语句

Hibernate: select student0_.id as id1_0_, student0_.name as name1_0_, student0_.class_id as class3_1_0_ from student_join student0_ where student0_.id=?
学生1
Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_
from classes_join classes0_ where classes0_.id=?
高一(1)

======================================

2)设置fetch="join",如:
<many-to-one name="classes" column="classesid" fetch="join"/>

fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合

此时lazy会失效

执行结果:一条join语句

Hibernate: select student0_.id as id1_1_, student0_.name as name1_1_, student0_.class_id as class3_1_1_, classes1_.id as id0_0_, classes1_.name as name0_0_ from student_join student0_ left outer join classes_join classes1_ on student0_.class_id=classes1_.id where student0_.id=?
学生1
高一(1)

======================================================

二、hibernate抓取策略(集合代理的批量抓取,fetch=select(默认)/join/subselect

测试用例:

Classes c = (Classes) session.load(Classes.class, new Integer(1));
    System.out.println("Class.name=" + c.getName());
    Set stuSet = c.getStudents();
    System.out.println(stuSet.size());
    if(stuSet != null && !stuSet.isEmpty()){
     for(Iterator it = stuSet.iterator(); it.hasNext();){
      Student s = (Student) it.next();
      System.out.println("student.name=" + s.getName());
     }
    }

1)保持默认,同fetch="select",如:
<set name="students" inverse="true"
fetch="select">

fetch="select",另外发送一条select语句抓取当前对象关联实体或集合

测试结果:2条独立的查询语句

Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from classes_join classes0_ where classes0_.id=?
Class.name=高一(1)
Hibernate: select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_
from student_join students0_ where students0_.class_id=?
9
student.name=
学生7
student.name=
学生3
student.name=
学生1
student.name=
学生8
student.name=
学生2
student.name=
学生4
student.name=
学生5
student.name=
学生9
student.name=
学生6

(2)设置fetch="join",如:
<set name="students" inverse="true"
fetch="join">

fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合

此时lazy会失效

测试结果:1条独立的join查询语句

Hibernate: select classes0_.id as id0_1_, classes0_.name as name0_1_, students1_.class_id as class3_3_, students1_.id as id3_, students1_.id as id1_0_, students1_.name as name1_0_, students1_.class_id as class3_1_0_ from classes_join classes0_ left outer join student_join students1_ on classes0_.id=students1_.class_id where classes0_.id=?
Class.name=
高一(1)
9
student.name=
学生6
student.name=
学生4
student.name=
学生9
student.name=
学生7
student.name=
学生2
student.name=
学生3
student.name=
学生8
student.name=
学生1
student.name=
学生5

(3)设置fetch="subselect",如:用在查询语句
<set name="students" inverse="true"
fetch="subselect">

fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合

测试用例:

List classList = session.createQuery("from Classes where id in (1,2,3)").list();
    for(Iterator iter = classList.iterator(); iter.hasNext();){
     Classes c = (Classes)iter.next();
     System.out.println("Class.name=" + c.getName());
     Set stuSet = c.getStudents();
     System.out.println(stuSet.size());
     if(stuSet != null && !stuSet.isEmpty()){
      for(Iterator it = stuSet.iterator(); it.hasNext();){
       Student s = (Student) it.next();
       System.out.println("student.name=" + s.getName());
      }
     }
    }   

当不设fetch="subselect" ,即:<set name="students" inverse="true">,结果如下:

执行了3条查询语句

Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from classes_join classes0_ where classes0_.id in (1 , 2 , 3)
Class.name=
高一(1)
Hibernate:
select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
9
student.name=
学生8
student.name=
学生5
student.name=
学生3
student.name=
学生9
student.name=
学生7
student.name=
学生1
student.name=
学生4
student.name=
学生6
student.name=
学生2
Class.name=
高一(2)
Hibernate:
select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
4
student.name=
学生3
student.name=
学生4
student.name=
学生1
student.name=
学生2
Class.name=
高一(3)
Hibernate:
select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
0

当不设fetch="subselect" ,即:<set name="students" inverse="true" fetch="subselect">,结果如下:

执行了1条查询语句(嵌套子查询)

Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from classes_join classes0_ where classes0_.id in (1 , 2 , 3)
Class.name=
高一(1)
Hibernate:
select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id in (select classes0_.id from classes_join classes0_ where classes0_.id in (1 , 2 , 3))
9
student.name=
学生8
student.name=
学生4
student.name=
学生5
student.name=
学生9
student.name=
学生6
student.name=
学生2
student.name=
学生3
student.name=
学生1
student.name=
学生7
Class.name=
高一(2)
4
student.name=
学生3
student.name=
学生4
student.name=
学生2
student.name=
学生1
Class.name=
高一(3)
0

posted on 2011-06-18 15:33 ... 阅读(141) 评论(0)  编辑  收藏 所属分类: Struts Hibernate Spring MyBatis


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿

随笔分类

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜