zoukankan      html  css  js  c++  java
  • Hibernate的fetch

    hibernate抓取策略fetch详细解释
    一、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语句抓取当前对象关联实体或集合

    hibernate抓取策略fetch具体解释
    运行结果: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语句使用外连接来载入其关联实体或集合

    hibernate抓取策略fetch具体解释
    此时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)hibernate抓取策略fetch具体解释
    保持默认,同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))

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

    总结:

    hibernate抓取策略(单端代理的批量抓取)

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

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

    2.hibernate抓取策略(单端代理的批量抓取)

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

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

    此时lazy会失效

    3.hibernate抓取策略(集合代理的批量抓取)

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

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

    4.hibernate抓取策略(集合代理的批量抓取)

    设置fetch="join",如:
    <set name="students" inverse="true" cascade="all" fetch="join">

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

    此时lazy会失效


    5.hibernate抓取策略(集合代理的批量抓取)

    设置fetch="subselect",如:
    <set name="students" inverse="true" cascade="all" fetch="subselect">

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

    6.hibernate抓取策略,,batch-szie在<class>上的应用

    batch-size属性,能够批量载入实体类。參见:Classes.hbm.xml
    <class name="Classes" table="t_classes" batch-size="3">

    当查classes对象时发出9条hql语句配置过后batch-size=3后会之发9/3=3条hql语句,提高性能

    7.hibernate抓取策略,batch-szie在集合上的应用


    batch-size属性。能够批量载入实体类,參见:Classes.hbm.xml
    <set name="students" inverse="true" cascade="all" batch-size="5">

    当查students对象时发出10条hql语句配置过后batch-size=5后会之发10/5=2条hql语句,提高性能

    总体分析:缺省值是fetch="select"       当配置fetch="join"直接查询包括对象或集合lazy失败。

  • 相关阅读:
    UE4 Hello World 创建第一个UE4工程
    集团企业数据信息系统建设方案
    Ubuntu_ROS中应用kinect v2笔记
    电力企业计量生产运行系统总体解决方案
    电力企业信息化建设解决方案之计量生产分析系统
    BQ24296充电管理芯片使用过程中的注意事项
    微信测试号开发之四 获取access_token和jsapi_ticket
    微信测试号开发之五 自定义菜单
    微信测试号开发之六 图灵自动回复文本消息
    微信测试号开发之七 获取用户地理位置
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4584423.html
Copyright © 2011-2022 走看看