[轉]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 ... 閱讀(148) 評論(0)  編輯  收藏 所屬分類: Struts Hibernate Spring MyBatis

          <2011年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 高平市| 富裕县| 修水县| 大庆市| 山东| 肥东县| 盐源县| 扶风县| 胶南市| 体育| 平定县| 章丘市| 南漳县| 三都| 修武县| 沂南县| 嘉善县| 铜山县| 陇南市| 贡觉县| 南康市| 天津市| 商城县| 四子王旗| 新平| 平邑县| 德江县| 霍邱县| 田林县| 安国市| 昭平县| 巴中市| 繁峙县| 平山县| 桐庐县| 九江县| 池州市| 涡阳县| 锡林郭勒盟| 东平县| 彭州市|