Hibernate的检索策略:类级别的检索策略;1对多,多对多的检索策略;多对一,一对一的检索策略

    1.类级别的检索策略,可以通过class元素的lazy属性来设置,该设置只对load方法有效果

    2.1对多,多对多的检索策略(默认开启懒加载):通过set元素的三个属性来控制,查询1方带出n方:lazy定义多方集合初始化的时机;fetch定义查询多方时sql的形式(select/subselect),如果取值为join则定义多方集合初始化的时机,这个会覆盖lazy属性的值,即忽略lazy的设置;batch-size:检索发送sql语句的次数,提高效率

    Lazy属性:通过设置lazy=false,将延长加载变为立即加载。一般不建议这么做,lazy除了可以设置true,false,还可以设置为extra(增强延迟加载),该值可以尽可能的 延迟集合初始化的时机

       当lazy设置为true(默认值,延迟加载),hibernate在以下情况初始化集合代理实例

          1)程序第一次访问集合属性的iterator(),size(),isEmpty(),contains()等方法

          2)通过Hibernate.initialize()静态方法显示初始化

  ·     当lazy设置为extra(增强延迟加载)时,Hibernate第一次访问集合的iterator()方法时会吃初始化集合代理实例,在调用集合的size(),isEmpty(),contains()方法 的时候并不会初始化集合代理实例,而是通过sql查询必要的信息

     batch-size属性:通过设置batch-size通过改变发送的sql语句(加入in子句)从而来减少发送sql语句的次数:比如1方有4个,那么对于查询n方就要发送4条语句,如果设置了batch-size的值为2,那么查询的时候只会发送2条sql语句

     fetch属性:该属性可以有select(默认),subselect,join三个值,当值 为select按照正常的方式来初始化set元素,如果设置为subselect,将通过子查询一次性初始化所有的set集合(而不是按照batch-size设置的那样),所以这个时候batch-size属性失效。具体的子查询的样子是将1方所有的oid查询出来的sql,作为查询n方in之后的语句即子查询从而一次性查询出所有的n方数据;如果设置为join,则决定set集合初始化的时机,即在加载1方对象的时候使用迫切左外连接(使用左外连接查询的时候同时把set集合初始化了)的方式检索n方的集合属性(这个时候就不是懒加载了),所以这个时候lazy属性失效。注意HQL查询的时候会忽略fetch=join 的取值

     3.多对一,一对一的检索策略:通过设置many-to-one元素的相关属性来控制。查询n方法带出1方

        Lazy属性:这里的lazy属性的取值和上面的不一样,为proxy(默认的表示使用延迟加载),和false(表示不适用延迟加载)。

        fetch属性:设置为join时,同样会在查询n方式用迫切左外连接查询出1方集合的属性值(不再是延迟加载)这个时候同样会忽略lazy的设置

        batch-size属性:这个时候该属性需要设置在1方的class属性上,才会起作用。比如利用hql查询出所有的n方数据,遍历n方集合查询出1方数据,如果查询1方数据需要3条语句,这个时候设置 batch-size=2,则只要发送2条sql语句即可。原理也是通过在添加in子句

HQL查询:

  1.使用HQL查询的步骤为:

    1)创建Query对象

    2)设置参数,参数可以使基本类型,也可以是实体类型(调用setEntity()方法来设置),设置参数的方法有第一种按照位子来设置,第二种按照参数名(在hql中参数名前面加上“:”)来设置,Query对象支持连续的设置值,也就是说每次set完之后返回的还是Query对象

    3)执行查询

  2.HQL提供的分页查询是跨平台:setFirstResult(index) 设置起始位子,默认从0开始;setMaxResults(size)设置每一页显示的数据数量;

  3.可以将hql语句通过配置元素Query放到配置文件中,为了防止大小写有歧义,需要<![CDATA[]]>用将hql包起来,然后调用方法session.getNamedQuery(string queryName)来获得,更加灵活的对hql语句做调整

  4.hql 投影查询,其实就是查询某些字段而不是所有字段(需要加上select),这个时候正常返回的是这些字段组成的数组组成的list集合。为了操作方便可以在hql中new的方式将数组封装成对象,对应的需要在实体类中添加构造器

  5.hql的报表查询其实就是在hql中可以使用分组聚合函数的语法

  6.hql的连接表查询

      1)左连接:left join:查询所有记录的时候,默认返回的是俩个表对应的对象组成的数组组成的list集合。如果加上select显示的查询对象(既可以是主表,也可以是另一个另一个连接表),返回的是主表对象组成的list,但是在访问该对象管理的对象的时候,每一次访问都会放sql语句,效率低下。所以查询的时候基本上都用迫切连接查询

      2)迫切左外连接 left join fetch:即在查询的时候就初始化了关联对象的集合,不用每次查询都发送sql语句。返回的是主表对象的集合

      3)hql中没有显示的指定检索策略,会使用配置文件中使用的检索策略。hql中要使用迫切连接只能加上fetch关键字,而不能通过在配置文件中配置fetch=join来实现,即使配置了,也会被忽略

  7.hibernate的QBC查询步骤:

      1)创建Criteria对象

      2)添加拼接条件

      3)执行查询

    QBC查询提供了更加面向对象的方式来拼接查询的条件,比如and,or,min,order by等等

  8.hibernate 的二级缓存

    1)默认关闭二级缓存,开启二级缓存的步骤为:先配置好第三方的二级缓存实现比如 EHCache,现在cfg.xml中配置开启二级缓存,在针对需要放入二级缓存的类做针对性的配置,这种配置可以防止cfg中,也可以放在对应类的hbm.xml映射文件中

    2)二级缓存是session共用的

    3)二级缓存提供了四种并发访问策略,每一中对应数据库的四种隔离级别

    4)类级别的二级缓存和集合级别的二级缓存都要针对性的配置才能起作用。如果要开启集合的二级缓存,一定要同时开启集合中对象的二级缓存,这样才能提高效率(因为只是缓存id,如果不对集合中的对象开启二级缓存,就会按照id一个一个的去数据库查,效率反而低了)

    5)二级缓存默认对Query对象Criteria对象的查询不起作用(即使是同一个session创建的同一个Query对象/Criteria对象的俩次查询操作,也是要发送俩次sql语句的),如果要让这俩种查询也具有二级缓存的特性,需要另外的开启查询缓存(不仅要在配置文件中开启,还要在代码中开启),查询缓存依赖二级缓存

    4)对缓存的配置体现在对应的配置文件中比如ecache.xml,配置文件中每个<cache>为一个 缓存区域,,通过对区域的命名(类的全限定名或者类的全限定名.结合属性)可以将不同对象放入不同的缓存区当中。如果没有配置,那么 所有的数据都放入默认的缓存区。除此之外还包括是否永久有效(设置为永久会忽略其他时间设置),空闲时间,存活时间(大于空闲时间)

  管理sessioin相关

    将session和本地线程绑定,hibernate以及提供了,需要配置以及通过SessionFactory的方法获得。而不用自己绑定的到ThreadLocal中;如果sessioin是由线程管理,那么在事务回滚或者提交的时候session就已经关闭了(这就意味着不用写很多繁杂的关闭session操作)。配置<property name="current_session_context_class" >thread</property>。 sessionFactory.getCurrentSession()

·  批量操作相关

    1)session(需要定量的提交事务,因为怕持久化对象把内存搞爆)

    2)hql    

    3)StatelessSession

    3)jdbc api (推荐使用)

Hibernate检索学习的更多相关文章

  1. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  2. j2ee开发之hibernate框架学习笔记

    hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...

  3. Hibernate —— 检索策略

    一.Hibernate 的检索策略本质上是为了优化 Hibernate 性能. 二.Hibernate 检索策略包括类级别的检索策略.和关联级别的检索策略(<set> 元素) 三.类级别的 ...

  4. 7.Hibernate 检索

    1.Hibernate检索方式 检索方式简介: 导航对象图检索方式:根据已经加载的对象,导航到其他对象.OID检索方式:按照对象的OID来检索对象.Session 的 get() 和 load() 方 ...

  5. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  6. Hibernate进阶学习3

    Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...

  7. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  8. (转) Hibernate检索方式概述

    http://blog.csdn.net/yerenyuan_pku/article/details/70554816 Hibernate检索方式概述 我们在对数据库的操作中,最常用的是select, ...

  9. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Python3基础 dict items 以元组的形式打印出字典的每一个项

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  2. Oracle 存储过程入门(一)

    一,基本入门介绍 公司系统需要用到oracle,可是还没在项目用过oracle,好吧,从基本学起.有问题的地方,欢迎指导啊. 看创建存储过程的基本定义.注意,带有[]的都是可选的,可有可无的.只是语法 ...

  3. 论文笔记——NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING

    论文地址:https://arxiv.org/abs/1611.01578 1. 论文思想 强化学习,用一个RNN学一个网络参数的序列,然后将其转换成网络,然后训练,得到一个反馈,这个反馈作用于RNN ...

  4. 处理文字基线 文字对不齐 font-size

    这是我无意中发现的,先记录下 比如你在一个h1标签里面添加文字,或者在其他块级标签添加文字,想让他们间隙少一点,(基线影响)可把行高设置为line-height: 1;就达到消除基线的作用. 建议使用 ...

  5. 告诉你什么是javascript的回调函数

    函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.F ...

  6. ACMG遗传变异分类标准与指南

    2015年,美国权威机构——美国医学遗传学与基因组学学会(ACMG)编写和发布了<ACMG遗传变异分类标准与指南>.为帮助我国医疗工作者和遗传咨询从业者更好地理解ACMG遗传变异分类标准. ...

  7. 2:JavaScript中的基本运算

    今天说的是JavaScript中的数据基本运算 在上一节中已经说了关于JavaScript中的基本数据类型 那么数据有了 剩下来就是数据之间的运算 表达式-------预算符(赋值 比较 算数 逻辑 ...

  8. python自动制作gif并添加文字

    引言     最近租的房子快到期了,哎,因为去年是第一次找房子租,结果遇到了一个东北黑中介,押一付三,房子有啥问题,灯坏了,下水道堵了,原来签合同的时候说的客气,说是马上就会上门解决,结果实际上我每次 ...

  9. Linux——用户管理简单学习笔记(四)

    主要讲两个用户管理的案例: 1: 限制用户su为root,只允许某个组的的用户su # groupadd sugroup 首先添加我们的用户组 # chmod 4550 /bin/su 改变命令的权限 ...

  10. go 语言字典遍历

    package main import "fmt" func main() { var countryCapitalMap map[string]string /*创建集合 */ ...