Hibernate学习笔记


1.Hibernate的核心配置文件是什么及其作用?

  hibernate框架默认会加载classpath下的核心配置文件hibernate.cfg.xml

作用:

  1. 加载对象关系映射文件;

  2. 配置hibernate运行的参数(属性),如会话工厂所需要的属性:

  数据库方言(决定了hibenrate发出哪个数据库认识的sql语句)、驱动、连接url、用户名和密码,数据库连接池、事务隔离级别,开启二级缓存等。

2.sessionFactory会话工厂生命周期

  整个运行过程中只有一个sessionFactory实例即可,使用单例模式管理sessionFactory。
  sessionFactory是线程安全的!

3.Hibernate中有哪几种关联关系?

4种:
一对一,一对多,多对一,多对多

4.Hibernate对象的三大状态:

  • 瞬时态 transient
    new了一个对象,此时对象就是瞬时态;
    瞬时态对象和数据库记录没有对应关系,和session没有关系。

  • 持久态 persistent
    瞬时态对象执行save方法后变成持久态;
    持久态对象和数据库记录存在对应关系,和session有关系。
    修改对象的属性,会直接将数据保存到数据库中。

  • 托管态Detached
    当session关闭后,持久态对象变为托管态。
    托管态对象和session没有关系,可能和数据库存在对应也可能不对应。

5.QBC

  QBC(Query By Criteria)按条件查询,通过Criteria构造查询条件,即通过调用Criteria的api实现各种查询。

  通过Criteria对象拼装 查询条件,调用Criteria的add方法拼接查询条件,最终hibernate通过criteria对象自动生成sql语句。

  

6.一级缓存与二级缓存

一级缓存:

  1. session级别的缓存,是线程级别的缓存;

  2. 在session中有一块内存区域,存储了持久态的对象;

  3. 第一次从数据库查询到数据存到session, 当session不关闭,再次查询不会向数据库发出sql;

  4. 当session关闭了,一级缓存就会被清空。

二级缓存:
  sessionFactory级别的缓存,是进程级别的缓存;
  可以跨session,多个session可以公用二级缓存的数据。
  
二级缓存区域:

1. 类级别缓冲区,存储了散装对象
数据结构:map
  [ key:对象的主键值+对象的全类路径,value:对象内容 ]

2. 查询缓存区域,存储了查询结果集
  任意执行一个sql语句,将sql结果进行缓存
  数据结构:map [ key:sql语句本身+输入参数,value就是List<对象的主键值> ]

  

7.延迟加载

什么是延迟加载?
  当查询信息,建议只查询需要的信息,对于不需要信息当需要时再去查询,这叫延迟加载。

  好处:提高查询性能。
  例子:对象导航查询。

  1. 只查询基本信息,不查询关联属性;

  2. 当调用cstCustomer对象的get方法获取关联属性,再向数据库发出sql,去加载数据。

Get与Load:

load执行原理:

  1. 执行load查询,得到的是一个代理对象,没有发出sql

  2. 当调用get方法时,通过代理对象向数据库发出sql

延迟加载原理:

  1. 生成一个代理对象

  2. 执行加载时,通过代理对象向数据库发出sql

  

8.抓取策略

什么是抓取策略?
  指当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。

策略包括:

  1. 延迟加载

  2. 立即加载,将加载到数据抓取到对象的属性中。

(1)类级别的抓取策略
  (这里的lazy是class标签的属性,默认为true)

  1. 延迟加载
    在hbm.xml中class标签内设置lazy=”true”(延迟加载),相当于load方法;

  2. 立即加载
    在hbm.xml中class标签内设置lazy=”false”,立即加载,load和get方法效果一样。

  
(2)关联级别的抓取策略(重点掌握)

一对多、多对多:
  (这里的fetch和lazy位于class标签下的标签上,fetch=”select” lazy=”true”:此为一方的默认值)
set元素提供 lazy属性 和 fetch 用于设置 抓取策略:

  1. fetch=”select”(默认),lazy=”true”(默认):fetch=”select”每get请求发出sql,lazy=”true”表示延迟加载(一方lazy的值可设为true或false或extra);

  2. fetch=”join”(lazy不起作用):批量抓取,自动生成左外连接语句,将关联的多方数据抓取到一方的属性中。

  3. (一般不用) fetch=”select”(或不写),lazy=”false”,立即加载(注意:但这里的并不是生成左外连接sql,而是新建的查询sql语句去查外联表)。

最佳实践:
  在进行一对多、多对多关联查询时候,只查询基本信息而不需要关联多方数据的,一般情况下最好采用延迟加载的抓取策略。(就像查询客户列表时并不需要立即加载其联系人信息,就将两个表的关系映射配置为延迟加载,即默认设置)

多对一:
  (这里的fetch和lazy位于class标签下的标签上,fetch=”select” lazy=”proxy”:此为多方的默认值)
  根据客户查询客户来源,多对一。

hbm采用 元素,提供lazy属性和fetch属性,用来配置抓取策略:

  1. fetch=”join”:自动生成左外连接,将关联一方属性对象抓取到多方的属性,查询客户信息,将many-to-one中fetch设置join,通过qbc查询客户时自动生成一个客户表和数据字典表的关联查询语句。

  2. fetch=”select”,lazy=”proxy”:延迟加载

  3. (扩展) fetch=”select”(或不写),lazy=”false”:立即加载。比如在查询联系人信息时,会连带其所属的客户信息一并查询出来(注意:但这里的并不是生成左外连接sql,而是新建的查询sql语句去查客户表)。

  

9.HQL

  HQL是Hibernate Query Language缩写, 语法很像SQL语法,以完全面向对象的方式操作数据库。(QBC能做的HQL都能做,而反之不然)

HQL对象导航方式:
  Hql可以实现对象导航查询。
  注意:如果使用投影查询,得到List中是舜时态对象,不能使用对象导航。

HQL关联查询:
  因为经过测试:

  1. HQL对hbm.xml设置 fetch参数无效;

  2. HQL对hbm.xml设置lazy=true,lazy=false有效。

    所以通过HQL实现fetch=”join”的功能。

---------------- The End ----------------
0%