为什么80%的码农都做不了架构师?>>>   

6、抓取策略:抓取策略主要是指获取连接对象的策略。

6.1、基于XML的抓取

1.1、基于XML抓取many-to-one

           session = HibernateUtil.openSession();/*** 默认情况会发出3条SQL语句,一条取Student,一条取Classroom,一条取Special* many-to-one的默认情况,使用的是延迟加载*/Student stu = session.load(Student.class, 1);System.out.println(stu.getName()+","+stu.getClassroom().getName()+","+stu.getClassroom().getSpecial().getName());

1.2、设置fetch="join"

         session = HibernateUtil.openSession();/*** 默认情况会发出3条SQL语句,一条取Student,一条取Classroom,一条取Special* 通过设置XML中的<many-to-one name="classroom" column="cid" fetch="join"/>* 可以完成对抓取的设置,只会发出一条SQL语句*/Student stu = session.load(Student.class, 1);System.out.println(stu.getName()+","+stu.getClassroom().getName()+","+stu.getClassroom().getSpecial().getName());
      <!-- 设置了fetch="join"之后,会连接查询将对象加载出来 --><many-to-one name="classroom" column="cid" fetch="join"/>

存在问题:延迟加载失效

          session = HibernateUtil.openSession();/*** 使用fetch="join"虽然可以将关联对象抓取,但是如果不使用关联对象也会一并查询出来* 这样会占用相应的内存*/Student stu = session.load(Student.class, 1);//延迟加载就失效System.out.println(stu.getName());

1.3、但是fetch="join"无法抓取HQL中的list,如果需要抓取HQL中的list有两种方法:

·设置one这一端对象的batch-size,此时会通过in的语句来加载多条数据。

<hibernate-mapping package="org.pm.hibernate.model"><!-- 设置batch-size="20",在抓取Classroom的时候,会一下抓取20Classroom的记录 --><class name="Classroom" table="t_classroom" batch-size="20"><id name="id"><generator class="native"/></id>
           session = HibernateUtil.openSession();/*** 在XML中配置了fetch="join"仅仅只是对load的对象有用,对HQL中查询的对象无用,* 所以此时会发出查询班级的SQL,解决这个SQL的问题有两种方案,* 一种是设置对象的抓取的batch-size* 另一种方案在HQL中指定抓取*/List<Student> stus = session.createQuery("from Student", Student.class).getResultList();for(Student stu:stus) {System.out.println(stu.getName()+","+stu.getClassroom().getName());}

·在HQL语句中写预抓取(特别注意:使用预抓取不支持count(*)查询)

           session = HibernateUtil.openSession();/*** 在XML中配置了fetch="join"仅仅只是对load的对象有用,对HQL中查询的对象无用,* 所以此时会发出查询班级的SQL,解决这个SQL的问题有两种方案,* 一种是设置对象的抓取的batch-size* 另一种方案在HQL中指定抓取,通过在HQL中添加fetch关键字完成抓取* 特别注意:如果使用了join fetch就无法使用count(*)*/List<Student> stus = session.createQuery("select stu from "+ "Student stu join fetch stu.classroom", Student.class).getResultList();for(Student stu:stus) {System.out.println(stu.getName()+","+stu.getClassroom().getName());}

1.4、集合抓取

       <!-- 设置fetch="subselect",对于list查询它会根据查询的结果来完成对对象的子查询 --><set name="stus" inverse="true" lazy="extra" fetch="subselect"><key column="cid"/><one-to-many class="Student"/></set>
           session = HibernateUtil.openSession();List<Classroom> clas = session.createQuery("from Classroom", Classroom.class).getResultList();for(Classroom cla:clas) {System.out.println(cla.getName());/** 抓取集合,默认是select,此时会为每一个班的学生发出sql* 对于通过HQL取班级列表并且获取相应的学生列表时,fetch="join"就无效了* 第一种方案可以设置set的batch-size来完成批量的抓取* 第二种方案可以设置fetch=subselect,使用subselect会完成根据查询出来的班级* 进行一次对学生对象的子查询*/for(Student stu:cla.getStus()) {System.out.print(stu.getName());}}

对于集合抓取而言,有三种设置方式:select(默认),join,subselect。

其中在查询单个对象时,select和subselect完全一样,都是在需要查询集合对象时才发出sql,但是join会
    使用连接查询。

在查询列表对象时,select和join一样(可以通过设置set的batch-size设置抓取的数量)

最佳实践:很多情况不会设置one-to-many,如果要设置one-to-many可以设置为subselect。

6.2、基于Annotation的抓取

1、基于Annotation的many-to-one

         session = HibernateUtil.openSession();/*** 对于Annotation的配置而言,默认就是基于join的抓取的,所以只会发出1条SQL*/Student stu = session.load(Student.class, 1);System.out.println(stu.getName()+","+stu.getClassroom().getName()+","+stu.getClassroom().getSpecial().getName());
            session = HibernateUtil.openSession();/*** 基于Annotation的配置没有延迟加载,此时会把所有的关联对象查询出来,发出大量的SQL语句*/List<Student> stus = session.createQuery("from Student", Student.class).getResultList();for(Student stu:stus) {System.out.println(stu.getName()+","+stu.getClassroom().getName());}
   @ManyToOne(fetch=FetchType.EAGER) //LAZY就是XML中select,EAGER就表示XML中的join@JoinColumn(name="cid")public Classroom getClassroom() {return classroom;}public void setClassroom(Classroom classroom) {this.classroom = classroom;}
          session = HibernateUtil.openSession();/*** 基于Annotation,由于many-to-one的默认抓取策略是EAGER的,所以当抓取Classroom* 时会自动发出多条SQL去查询相应的Special,此时可以通过join fetch继续完成对关联的* 抓取,或者直接将关联对象的fetch设置为LAZY,但是使用LAZY所带来的问题是在查询* 关联对象时需要发出相应的SQL,很多时候也会影响效率*/List<Student> stus = session.createQuery("select stu from "+ "Student stu join fetch stu.classroom cla join fetch cla.special", Student.class).getResultList();for(Student stu:stus) {System.out.println(stu.getName()+","+stu.getClassroom().getName());}

可以使用@BatchSize

@Entity
@Table(name="t_classroom")
@BatchSize(size=20)
public class Classroom {private int id;private String name;private int grade;private Set<Student> stus;private Special special;

2、集合抓取

    @OneToMany(mappedBy="classroom")@LazyCollection(LazyCollectionOption.EXTRA)@Fetch(FetchMode.SUBSELECT) //在Annotation中需要通过这种方式才能设置subselectpublic Set<Student> getStus() {return stus;}public void setStus(Set<Student> stus) {this.stus = stus;}@ManyToOne(fetch=FetchType.LAZY)@JoinColumn(name="spe_id")public Special getSpecial() {

转载于:https://my.oschina.net/pmos/blog/768310

Hibernate抓取策略相关推荐

  1. hibernate教程--抓取策略详解

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  2. hibernate教程--抓取策略

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  3. Hibernate 中集合对象的抓取策略(Fetching strategies)

    Product.java 代码: package com.b510.examples; /**  * Product entity. @author MyEclipse Persistence Too ...

  4. Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

    假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session ...

  5. Hibernate 原汁原味的四种抓取策略(转)

    原文出处:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html     尊重原作者,访问原创地址 最近在研究 Hibernate ...

  6. JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题

    Hibernate的检索方式  Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经加载的对象导航到其他对象. OID检索方式:按照对象的OID来检索对象. HQL检索方式: ...

  7. BASLER Pylon 抓取策略

    One by One Grab Strategy 逐个抓取策略 当使用 one by one 抓取模式时,图像按其获取顺序处理. 相机抓取引擎实例将空缓存队列中的缓存取消,并将空缓存排入低级别API流 ...

  8. 蜘蛛爬虫的抓取策略有哪些呢?

    数据抓取系统是搜索引擎重要组成的系统之一,主要负责互联网信息的搜集.保存和更新等等,他就像蜘蛛一样在互联网中爬来爬去,所以叫做蜘蛛爬虫. 搜索引擎蜘蛛抓取页面的时候,会从一些重要的页面开始,通过内链来 ...

  9. 蜘蛛爬行策略或网络抓取

    这些处理被称为网络抓取或者蜘蛛爬行.很多站点,尤其是搜索引擎,都使用爬虫提供最新的数据,它主要用于提供它访问过页面的一个副本,然后,搜索引擎就可以对得到的页面进行索引,以提供快速的访问. 打开百度AP ...

最新文章

  1. 阿里巴巴关于Java重要开源项目汇总
  2. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最小值(rolling min)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最小值
  3. Java Web整合开发(14) -- Struts 1.x 概述
  4. Java中对接钉钉API获取数据流程
  5. 个人周报20200420
  6. JavaSE知识点个人总结(不断更新)
  7. android 多线程断点续传下载 三
  8. Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)
  9. 总结对象的两个方法valueof和tostring
  10. MyBatis框架parameterType为哈希类型的别名映射和resultMap映射
  11. 在OS X 10.9上安装Java(Mavericks)
  12. 电容充放电原理图_HDI滤波电容FANOUT案例
  13. 极光IM即时通讯初探
  14. golang html转成pdf,使用_go-wkhtmltopdf_将html转pdf
  15. 246 中心对称数
  16. 2018年的生活及工作计划
  17. IE主页被篡改且无法修改解决方法
  18. php接入阿里云OOS
  19. Python从zip文件里导入包
  20. Python实现消息发送

热门文章

  1. CCF-CSP 201703-1 试题名称: 分蛋糕
  2. Linux下命令行的彩色终端
  3. hadoop +hbase +zookeeper 完全分布搭建 (版本一)
  4. struts2实现拦截器的方法
  5. sqlserver临时表
  6. C++写的一个简单的词法分析器(分析C语言)
  7. 浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式
  8. CSS 外补白(Margin) 内补白(Padding) 边框属性 定位(positioning)属性 布局(layout)属性
  9. Pro ASP.NET MVC –第五章 使用Razor
  10. leetcode Longest Palindromic Substring