hibernate抓取策略


什么是抓取策略,先看例子。。。

一、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_joinstudent0_ 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会失效

 

执行结果:1条join语句

 

Hibernate: select student0_.id as id1_1_,student0_.name as name1_1_, student0_.class_id as class3_1_1_, classes1_.id asid0_0_, classes1_.name as name0_0_ from student_join student0_ left outer joinclasses_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, newInteger(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_ wherestudents0_.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 asid3_, students1_.id as id1_0_, students1_.name as name1_0_, students1_.class_idas class3_1_0_ from classes_join classes0_ left outer join student_joinstudents1_ 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("fromClasses where id in (1,2,3)").list();
    for(Iteratoriter = 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" ,即:<setname="students" inverse="true">,结果如下:

 

执行了3条查询语句

 

Hibernate: select classes0_.id as id0_, classes0_.nameas 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_ wherestudents0_.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_ wherestudents0_.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_ wherestudents0_.class_id=?

0

 

 

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

 

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

 

Hibernate: select classes0_.id as id0_, classes0_.nameas 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_ wherestudents0_.class_id in (select classes0_.id from classes_join classes0_ whereclasses0_.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

 总结

抓取策略,在我看来就是对 对象之间有关联的对象进行查询过程中如何获取关联对象的策略;无疑,就是内连接或外连接(包含左连接、右连接),这种连接sql语句我们都可以自己写,学习.net时都是自己写连接语句来查询有之间有关联表数据,而hibernate是对其进行了封装,我们只需要在配置文件中进行不同的设置即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值