当使用xml配置类之间的关系时 ,例如 学生 班级,多对一关系

    /**

* 默认情况会发出2条SQL语句,一条取student,一条取Classroom,其实这只需要一条sql
             * 解决办法  通过设置XML中的<many-to-one name="classroom" column="cid" fetch="join"/> //默认fetch=select
             * 可以完成对抓取的设置
             */
            session = HibernateUtil.openSession();
            Student stu = (Student)session.load(Student.class, 1); //只查一个学生
            System.out.println(stu.getName()+","+stu.getClassroom().getName()) 

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

      缺点。有时候不需要班级信息也会查出来,占用内存 ,延迟加载就不起作用了

     session = HibernateUtil.openSession();
            Student stu = (Student)session.load(Student.class, 1);
            //延迟加载就失效,自动查班级信息
            System.out.println(stu.getName());

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

    但是当查询所有学生时 使用xml配置。并且使用fetch=join 如下代码 又会发查询学生sql和班级的sql

    List<Student> stus = session.createQuery("from Student").list(); //查询全部学生
            for(Student stu:stus) {
                System.out.println(stu.getName()+","+stu.getClassroom().getName());
            }

     在XML中配置了fetch=join仅仅只是对load的对象有用,对HQL中查询的对象无用

     解决办法1 。设置查询班级的数量  batch-size,但是查询的数据随着session关闭就没了,

    <class name="Classroom" table="t_classroom" batch-size=''20''>

    解决办法 2 使用fetch关键字 在hql中  ,如果使用了join fetch就无法使用count(*)

    List<Student> stus = session.createQuery("select stu from " +
                    "Student stu join fetch stu.classroom").list();
            for(Student stu:stus) {
                System.out.println(stu.getName()+","+stu.getClassroom());
            }

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

当使用annotation配置类之间关系时。

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

    /**
             * 对于Annotation的配置而言,默认就是基于join的抓取的,所以只会发出一条SQL
             */

     session = HibernateUtil.openSession();
     Student stu = (Student)session.load(Student.class, 1); //只查一个学生
            System.out.println(stu.getName()+","+stu.getClassroom().getName());

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

    但是annotation默认没有延迟加载。如果查询全部学生。会自动查处关联的班级信息。发大量sql语句 这也是个问题

    List<Student> stus = session.createQuery("from Student").list(); //查所有学生
            for(Student stu:stus) {
                System.out.println(stu.getName());
            }

    解决 使用annotation时设置ManToOne(fetch=FetchType.Lazy)  延迟加载 相当于xml配置中 默认也就是fetch='select'

    影响 1 但是一下代码又会发2条sql

    session = HibernateUtil.openSession();
            Student stu = (Student)session.load(Student.class, 1);
            System.out.println(stu.getName()+","+stu.getClassroom().getName())

    影响 2     

    当又想查询所有学生和所在班级信息 如下代码,又会发多条SQL。查学生SQL。和班级SQL

    List<Student> stus = session.createQuery("from Student").list();
            for(Student stu:stus) {
                System.out.println(stu.getName()+","+stu.getClassroom().getName());
            }

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

    @ManyToOne(fetch=FetchType.LAZY)//LAZY就是XML中的select,EAGER就表示XML中的join

    annotation默认是EAGER

@BatchSize(size=20)
             public class Classroom   相当于xml中的batch-size 设置

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

总结,当你使用xml时。默认有延迟。当查询一个对象时。同时也查他的关联对象,会发多条sql。先查对象,再发sql查关联对象。使用fetch=join配置,也是只对load对象有用(就是load方法里传的class),hql中的对象(hibernate自己发送的hql语句中查询的对象)没用还是发好几条sql.解决要不就设置batch-size要不就自己用 join fetch 自己写hql

使用annotation时,默认是没延迟。查询一个对象。只发一条。但是查询多个对象时 ,又和xml中使用fetch=join 的情况一下样 ,但是你设置fetcg=FetchType.LAZY ,查询单一对象时,又会发两条,所以 要不就设置batch-size要不就自己用 join fetch 自己写hql

所以有时候。用别人的东西。不了解别人的东西就会问题很多。但你花很多时间去研究他。不如花时间研究数据库,用原生 sql ,

懂数据库的人,可能不用hibernate, 想用好还得精通hibernate。

不懂数据库的人。估计也不会花心思研究hibernate。研究了hibernate。你还得懂数据库

hibernate抓取问题的更多相关文章

  1. Hibernate 抓取策略fetch-1 (select join subselect)

    原文 :http://4045060.blog.51cto.com/4035060/1088025 部分参考:http://www.cnblogs.com/rongxh7/archive/2010/0 ...

  2. 029 hibernate抓取策略

    实例A引用实例B,B如果是代理的话(比如多对一关联中):如果遍历A的查询结果集(假设有10条记录),在遍历A的时候,访问B变量,将会导致n次查询语句的发出!这个时候,如果在B一端的class上配置ba ...

  3. hibernate抓取策略

    抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...

  4. Hibernate 抓取策略fetch-2 (批量抓取batch-size以及hibernate.jdbc.fetch_size、hibernate.jdbc.batch_size)

    类关系: User N~1 Group 测试代码: System.out.println("1"); List stuList = session.createQuery(&quo ...

  5. Hibernate 抓取策略

    抓取策略: 为了改变SQL语句执行的方式 当应用程序需要在Hibernate实体对象的关联关系间进行导航的时候,Hibernate如何获取关联对象的策略 抓取策略可以在O/R映射的元数据中声明,也可以 ...

  6. Hibernate批量抓取

    ------------------siwuxie095 Hibernate 批量抓取 以客户和联系人为例(一对多) 1.批量抓取 同时查询多个对象的关联对象,是 Hibernate 抓取策略的一种 ...

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

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

  8. 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】

    一.抓取策略. 1.hibernate中提供了三种抓取策略. (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式.使用这种抓取方式hibernate会在select中内连接的方式获取 ...

  9. Hibernate的抓取策略

    立即检索:当执行某行代码的时候,马上发出SQL语句进行查询(get())延迟检索:当执行某行代码的时候,不会马上发出SQL语句进行查询.当真正使用这个对象的时候才会发送SQL语句(load()) 类级 ...

随机推荐

  1. LRU缓存介绍与实现 (Java)

    引子: 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系 了,要再次联系那位朋友的时候,我们又不得不求助电话本 ...

  2. jeecms栏目模型和内容模型的使用以及对应前台的标签中的属性名

    第一步:模型管理-添加模型: 栏目模板前缀设定方案下的channel目录下的ch_menu.html作为浏览栏目的模板页.对应访问网址:项目名/栏目名(一级或者二级栏目如news或者gnxw)/ind ...

  3. Tomcat安装JPress

    上线代码有两种方式,第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不多说了.第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面.下面让我们 ...

  4. Intel GPA果然是神器

    又一次PERF暗黑三...只有GPA帮到了我. Intel GPA是一个用于测试产品性能和质量的工具.使用这个工具可以运行在游戏或3D应用程序中用来看看它们是如何工作的,其优势性的一点是,有了Auto ...

  5. imagelist用法

    1.添加一个Imagelist控件,并双击控件图标如下图 2.点击新增按钮

  6. 一个自定义MVP .net框架 AngelFrame

    摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngelFrame.这个项目属于前端桌面管理系统的一部分,最终要集成进去. 关键 ...

  7. RAID 介绍

    介绍 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨 ...

  8. NGrinder操作指南

    一.使用nGrinder谷歌插件录制性能测试脚本: 1.下载录制插件压缩包ngrinder-recorder-1.0.7z,解压到本地目录. 2.打开Chrome浏览器,URL框内输入chrome:/ ...

  9. Mysql 学习笔记09

    ---Mysql 的主从复制  replication 1 主从复制原理 至少有2台服务器,一台主服务器,一台从服务器,主服务器的所有改动,如 insert update delete 操作,都会同步 ...

  10. jxl操作excel单个单元格换行和获取换行

    excel中同表格换行: a+"\n"+b 1.读取 String str = sheet.getCell(c, r).getContents(); String[] split ...