# 为什么要使用 hibernate?
- Hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码
- hibernate 是一个优秀的 ORM 框架,很大的简化了 DAO 层的编码功能
- 可以很方便的进行数据库的移植操作
- 提供缓存机制,使程序执行更高效
# 什么是 ORM 框架?
ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射为程序中的对象。
ORM 的优点:提供开发效率降低开发成本、开发更简单更对象化、可移植性更强。
# hibernate 中如何在控制台查看打印的 sql 语句?
在 Config 里面把 hibernate.show.sql 设置为 true,不建议开启,开启之后会降低程序的运行效率。
# hibernate 有几种查询方式?
- hql
- 原生 sql
- 条件查询 Criteria
# 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
Integer 类型为对象,它的值运行为 null,而 int 属于基本数据类型,值不能为 null。
# hibernate 是如何工作的?
- 读取并解析配置文件
- 读取并解析映射文件,创建 sessionFactory
- 打开 session
- 创建事物
- 进行持久化操作
- 提交事物
- 关闭 session
- 关闭 sessionFactory
# get () 和 load () 的区别?
- 数据查询时,没有 OID 指定的对象,get () 返回 null,load () 返回一个代理对象
- load () 支持延迟加载,get () 不支持延迟加载
# 说⼀下 hibernate 的缓存机制?
hibernate 常用的缓存为一级缓存和二级缓存
一级缓存:也叫 session 缓存,只在 session 作用范围内有效,不需要用户干涉,由 hibernate 自身维护,可以通过 evict (object) 清除 object 的缓存,clear () 清除一级缓存中的所有缓存,flush () 刷出缓存。
二级缓存:应用级别的缓存,在所有的 session 中有效,支持配置第三方的缓存,如:EhCache。
# hibernate 对象有哪些状态?
- 临时、瞬时状态:直接 new 出来的对象,该对象还没被持久化(没保存到数据库中),不受 session 管理
- 持久化状态:当调用 session 的 save、saveOrUpdate、get、load、list 等方法的时候,对象就是持久化状态
- 游离状态:session 关闭后对象就是游离状态
# 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
- getCurrentSession 会绑定当前线程,而 openSession 不会
- getCurrentSession 事物是 Spring 控制的,并且不需要手动关闭,而 openSession 需要我们手动开启事物和提交事物。