hibernate框架学习之数据抓取(加载)策略

时间:2022-10-22 16:12:44

Hibernate获取数据方式

lHibernate提供了多种方式获取数据

•load方法获取数据

•get方法获取数据

•Query/ Criteria对象获取数据

lHibernate获取的数据分为两类

•直接获取的数据(类级数据/直接数据)

•使用load/get方法根据OID获取数据

•使用HQL语句获取到的数据

•使用Criteria对象获取到的数据

•使用关联关系获取主方数据时自动获取的从方数据(关联数据)

•在一对一关系中,获取一方数据后所携带的从方数据

•在一对多关系中,获取一方数据后所携带的从方数据

•在多对一关系中,获取多方数据后所携带的从方数据

•在多对多关系中,获取多方数据后所携带的从方数据

l直接数据都是由某种操作得到的,关联数据是不能由某种操作直接获取,是基于其他操作获取到的

直接数据加载方式

•load方法获取数据

•get方法获取数据

•Query对象提供OID获取数据

•Query对象调用list或uniqueResult获取数据

•Criteria对象调用list或uniqueResult获取数据

•Query对象不提供OID获取数据

•Query对象调用list或uniqueResult获取数据

•Criteria对象调用list或uniqueResult获取数据

直接数据的载策略

lload方法在加载数据时,判断一级缓存是否有被查找数据,如没有采用延迟加载形式获取数据,即只访问OID,不执行SQL语句,访问OID之外的属性,通过SQL语句获取数据。通过lazy属性配置控制是否延迟加载,如设置了lazy=“false”,那么将不存在延迟加载效果,此时load方法与get方法等同

lget方法在加载数据时,首先判断一级缓存中是否存在要查找的数据,如果没有通过SQL语句,直接从数据库获取

lQuery对象获取数据是直接通过SQL语句查找数据

l问题:以下操作完成后会出现几条SQL语句

•查找OID为10的数据,先执行load方法,遍历属性后,执行load方法,再遍历数据

•查找OID为10的数据,先执行load方法,遍历属性后,执行get方法,再遍历数据

•查找OID为10的数据,先执行get方法,不做任何遍历操作,执行 load方法,再遍历数据

•执行Query对象查询OID为10数据,不做任何遍历操作,执行load方法,再遍历数据

•执行Query对象查询OID为10数据,不做任何遍历操作,执行get方法,再遍历数据

关联数据加载策略

l关联数据的种类(以一对多为例)

•在一对多配置中,查询主方数据时要加载从方数据的集合,此时从方数据属于关联数据,以下称为主关联数据

•配置中<set>对应的数据

•在一对多配置中,查询从方数据时要加载主方数据的对象,此时主方数据属于关联数据,以下称为从关联数据

•配置中<many-to-one>对应的数据

•其他关联情况与上述情况完全相同

l关联关系中A到B与B到A的区别

主关联数据加载策略

l教师对学生的关系为一对多,此时在教师模型中配置学生的集合。对教师模型对应的配置文件中的set进行相关的配置,来控制对应的学生集合的数据加载策略

hibernate框架学习之数据抓取(加载)策略

•fetch:用于控制进行关联查询时,产生的SQL语句

•lazy:用于控制进行关联查询时,被关联数据的加载策略

•fetch取值范围:select / subselect / join

•lazy取值范围:true / false / extra

主关联数据加载策略fetch=select

llazy=false

•获取主数据

•执行主数据的查询SQL(一条SQL语句)

•执行主关联数据所有信息查询SQL (多条SQL语句)

•获取主关联数据集合中数据数量(A)

•不执行SQL语句

•获取主关联数据集合中数据的具体数据(B)

•不执行SQL语句

llazy=true

•获取主数据

•执行主数据的查询SQL

•获取主关联数据集合中数据数量(A)

•执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)

•获取主关联数据集合中数据的具体数据(B)

•执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)

l注意:

•操作A和操作B对应的查询SQL语句相同,查询执行后,数据存入一级缓存,下次查询时,不再执行SQL语句

llazy=extra

•获取主数据

•执行主数据的查询SQL

•获取主关联数据集合中数据数量(A)

•执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)

•获取主关联数据集合中数据的具体数据(B)

•执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)

l注意:

•先执行A操作,再执行B操作,AB操作均产生SQL语句

•先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

主关联数据加载策略fetch=subselect

llazy=false

•获取主数据

•执行主数据的查询SQL(一条SQL语句)

•执行主关联数据全部具体信息查询SQL (一条子查询SQL语句)

•获取主关联数据集合中数据数量(A)

•不执行SQL语句

•获取主关联数据集合中数据的具体数据(B)

•不执行SQL语句

l注意(以下fetch=subselect情况均符合下列描述):

•使用Query查询,并且未携带OID作为查询条件,查询SQL语句采用子查询的形式

•使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)

llazy=true

•获取主数据

•执行主数据的查询SQL(一条SQL语句)

•获取主关联数据集合中数据数量(A)

•执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)

•获取主关联数据集合中数据的具体数据(B)

•执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)

l注意:

•操作A和操作B对应的查询语句相同,查询执行后,数据存入一级缓存,下次查询时,不再执行SQL语句

•使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)

llazy=extra

•获取主数据

•执行主数据的查询SQL

•获取主关联数据集合中数据数量(A)

•执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)

•获取主关联数据集合中数据的具体数据(B)

•执行主关联数据对应的具体信息查询SQL (一条子查询SQL语句B)

l注意:

•先执行A操作,再执行B操作,AB操作均产生SQL语句

•先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

•使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)

主关联数据加载策略fetch=join

l使用Query查询数据(不区分是否携带OID作为参数)

llazy=false

•获取主数据

•执行主数据的查询SQL(一条SQL)

•执行主关联数据的查询SQL (多条SQL)

•获取主关联数据集合中数据数量(A)

•不执行SQL语句

•获取主关联数据集合中数据的具体数据(B)

•不执行SQL语句

l使用Query查询数据(不区分是否携带OID作为参数)

llazy=true

•获取主数据

•执行主数据的查询SQL(一条SQL)

•获取主关联数据集合中数据数量(A)

•执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)

•获取主关联数据集合中数据的具体数据(B)

•执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)

l注意:

•操作A和操作B对应的查询SQL语句相同,查询执行后,数据存入一级缓存,下次查询时,不再执行SQL语句

l使用Query查询数据(不区分是否携带OID作为参数)

llazy=extra

•获取主数据

•执行主数据的查询SQL(一条SQL)

•获取主关联数据集合中数据数量(A)

•执行主关联数据集合数据总量查询SQL (按需产生SQL语句A)

•获取主关联数据集合中数据的具体数据(B)

•执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)

l注意:

•先执行A操作,再执行B操作,AB操作均产生SQL语句

•先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

l使用load/get查询数据,此时lazy属性失效

•获取主数据

•SQL格式:左外连接查询

•主数据与主关联数据一次性全部查询出来(仅一条SQL)

•获取主关联数据集合中数据数量(A)

•不执行SQL语句

•获取主关联数据集合中数据的具体数据(B)

•不执行SQL语句

主关联数据加载策略总结

lfetch属性控制生成的SQL语句的策略

•select:独立查询语句

•subselect:子查询语句

•如果使用Query查询,并且没有提供OID时,才使用子查询

•join:左外连接查询

•如果使用load/get查询才使用左外连接查询

llazy

•false:不开启延迟加载策略

•true:开启延迟加载策略

•extre:开始加强延迟加载策略,当调用主关联数据集合对应的

size()、isEmpty()等操作时,不加载具体数据

从关联数据加载策略

l教师对学生的关系为一对多,此时在学生模型中配置教师的对象。对学生模型对应的配置文件中的many-to-one进行相关的配置,来控制对应的教师对象的数据加载策略

hibernate框架学习之数据抓取(加载)策略

•fetch:用于控制进行关联查询时,产生的SQL语句

•lazy:用于控制进行关联查询时,被关联数据的加载策略

•fetch取值范围:select / join

•lazy取值范围:false / proxy / no-proxy(Hibernate拦截器)

从关联数据加载策略fetch=select

llazy=false

•获取从数据

•执行从数据的查询SQL(一条SQL语句)

•执行从关联数据所有信息查询SQL (多条SQL语句)

•获取从关联数据集合中数据的具体数据

•不执行SQL语句

llazy=proxy

•获取从数据

•执行从数据的查询SQL(一条SQL语句)

•从关联数据lazy=false,执行从关联数据所有信息查询SQL(多条SQL)

•获取从关联数据

•从关联数据lazy=true,执行从关联数据所有信息查询SQL (按需产生SQL语句)

从关联数据加载策略fetch=join

l使用Query查询数据

llazy=false

•获取从数据

•执行从数据的查询SQL(一条SQL语句)

•执行从关联数据所有信息查询SQL (多条SQL语句)

•获取从关联数据

•不执行SQL语句

l使用Query查询数据

llazy=proxy

•获取从数据

•执行从数据的查询SQL(一条SQL语句)

•从关联数据lazy=false,执行从关联数据所有信息查询SQL(多条SQL)

•获取从关联数据

•从关联数据lazy=true,执行从关联数据所有信息查询SQL (按需产生SQL语句)

l使用load/get查询数据,此时lazy属性失效

•获取主数据

•SQL格式:左外连接查询

•从数据与从关联数据一次性全部查询出来(仅一条SQL)

•获取从关联数据

•不执行SQL语句

加载策略的选择

l延迟加载可以有效的节约内存空间

l在使用时,尽可能的使用延迟加载策略,只有不能使用延迟加载时,才使用立即加载策略

l实际开发应用

主/从数据加载优化

l主/从数据加载,基于关联关系,对关联数据进行预加载,加载时基于配置不同,会产生执行多条SQL语句加载同一系列的数据。

•例如获取主数据时,设定fetch=“select”,lazy=“false”

•此时获取主数时,会立即查询对应的联合数据集合,此时使用多条SQL语句完成此操作

l完成上述同一任务执行多条相同的SQL语句,需要开销的查询时间过高,此时可以通过设定每次查询获取的数据量提高效率

l关联关系<set>中添加批量抓取策略batch-size=“3”

批量抓取策略

l批量抓取可以对所有关联关系进行设定

•主数据关联数据

•<set>配置设置batch-size

•从数据关联数据

•<many-to-one>配置设置batch-size

lbatch-size的取值范围

•batch-size默认设置值为1,即一次抓取1条数据

•如果batch-size设置值过大,每次获取的数据量越多,内存消耗越高,速度越快

•如果batch-size设置值过小,每次获取的数据量越少,内存消耗越低,速度越慢

hibernate框架学习之数据抓取(加载)策略的更多相关文章

  1. hibernate框架学习之数据抓取&lpar;加载&rpar;策略helloworld

    package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Query; import org.hibern ...

  2. hibernate框架学习之数据查询(HQL)

    lHibernate共提供5种查询方式 •OID数据查询方式 •HQL数据查询方式 •QBC数据查询方式 •本地SQL查询方式 •OGN数据查询方式 OID数据查询方式 l前提:已经获取到了对象的OI ...

  3. hibernate框架学习之数据查询(QBC)helloworld

    package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Criteria; import org.hib ...

  4. hibernate框架学习之数据查询(QBC)

    lQBC(Query By Criteria)是一种Hibernate中使用面向对象的格式进行查询的计数 lQBC查询方式步骤 •获取Session对象 •初始化Criteria对象(使用Sessio ...

  5. hibernate框架学习之数据查询(HQL)helloworld

    package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...

  6. hibernate框架学习之数据查询(本地SQL)

    本地SQL查询方式 lHibernate框架支持使用原生态SQL语句进行操作数据库 l查询对象SQLQuery由Session获取 •SQLQuery sq = s.createSQLQuery(&q ...

  7. hibernate框架学习笔记4:主键生成策略、对象状态

    创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...

  8. Hibernate 加载策略得总结

    Hibernate 加载策略得总结 加载策略(优化查询): 策略种类: 延迟加载: 等到使用的时候才会加载数据. 立即加载: 不管使用不使用,都会立刻将数据加载. 策略的应用: 类级别的加载策略. 关 ...

  9. hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存

    QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...

随机推荐

  1. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  2. PL&sol;sql语法单元

    1.字符集 PL/SQL的字符集包括: 所有大小写字母:包括A~Z和a~z. 数字:包括0~9. 空白字符:包括制表符.空格和回车符 其他常用英文符号 2.标识符 标识符用于定义PL/sql变量.常量 ...

  3. C&num;结合LumiSoft&period;Net&period;dll读取Outlook邮件(&period;eml格式邮件)

    如果直接从Outlook(或者微软的其它邮件客户端如:Outlook Express.Windows Live Mail)的邮件文件(.eml格式)中提取各种电子邮件内容,使用LumiSoft.Net ...

  4. win server 2008配置ftp无法登陆问题的解决办法

    解决办法放在最前面,方便急需答案的同学: 创建了ftp使用的windows账户后,一定要给该账户添加ftp目录的权限,如下图所示,为新账户添加权限后(且设置了“ftp身份验证”),即可正常访问ftp: ...

  5. C&num; A窗口内容显示在B窗口中的方法

    HeScripts script = new HeScripts(); //A窗口中实例化B窗口 string okscripts = "test"; //设置字段内容 scrip ...

  6. Chaperon简介

    Chaperon是一个可以把有结构的Text转换成XML.它包括一个强大的LALR(1)解析器来解析Text和一个可以用来创建XML文档的Tree builder. http://chaperon.s ...

  7. linux-c&sol;c&plus;&plus;调试利器gdb、ddd小试

    linux-c/c++调试利器gdb.ddd小试 原文链接: http://deepfuture.iteye.com/blog/749148 博客分类: C++/C/lisp CC++C#LinuxU ...

  8. 制作多级菜单hide()与show() toggle()

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Python import与from import使用及区别介绍

    Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.接下来通过本文给大家介绍Python import与from import使用及区别介绍,感 ...

  10. 解读经典《C&num;高级编程》第七版 Page45-50&period;核心C&num;&period;Chapter2

    前言 本篇讲述枚举和名称空间. 01 枚举 首先需要明确枚举的概念:枚举是用户定义的整数类型.使用枚举的目标是,使用一组容易记忆的名称,来使得代码更容易编写和维护. 我们对比枚举的定义和类的定义,会发 ...