好程序员Java 教程分享Java 面试题之 Hibernate
1. 简书一下 Hibernated 的开发流程
第一步:加载Hibernate 的配置文件,读取配置文件的参数,
第二步:创建SessionFactory 会话工厂(内部有连接池)
第三步:打开Session 连接
第四步:开启事务
第五步:运行操作
第六步:提交事务
第七步:关闭session
第八步:关闭连接池
2.Hibernate 中对对象的三种状态
瞬时状态:不存在持久化标识的OID ,尚未与 HibernateSession 对象关联,被认为处于瞬时状态,失去引用将被 JVM 回收
持久态:存在持久标识OID ,与当前 session 有关联,并且相关联 Session 没有关闭,并且事务未提交
游离态:存在持久化标识OID, 但没有与当前 Session 关联,
3.Hibernate 的缓存机制
Hibernate 缓存机制分为两层, Hibernate 的一级缓存和 Hibernate 二级缓存。
1.Hibernate 一级缓存( Session 的缓存)
Session 实现了第一级 Cache, 属于事务级数据缓冲,一旦事务结束,缓存随之失效,一个 Session 的生命周期对应一个数据库事务或一个程序事务。
Session-Cache 总是被打开并且不能被关闭的
Session-Cache 保证一个 Session 中两次请求同一个对象时,取得的对象是一个 Java 实例,有时他可以避免数据不必要的冲突
Hibernate 二级缓存( SessionFactory 的缓存)
(1 ) Hibernate 二级缓冲是 SessionFactory 范围内的缓存,所有的 Session 共享一个二级缓存,在二级缓存中保存持久化实例
的散装形式的数据
(2 )持久化不同的数据需要不同的 Cache 策略,比如一些因素影响 Cache 策略的选择:数据的读写比例,数据表能否被其他的应用程序所访问等。
设置Hibernate 二级缓存需要分两步,首先,确认使用什么数据并发策略,然后,配置缓存期间时间并设置 Cache 提供器
Hibernate 的查询方式常见有三种: HQL,QBC( 命名查询 ) ,以及使用原生 SQL 查询
Hibernate 和 JDBC 优缺点对比
相同点:
1 )两者都是 java 数据库操作的中间件
2 )两者对数据库进行直接操作的对象时线程不安全的,都需及时关闭
3 )两者都可对数据库的更新操作进行显示的事务处理
使用的SQL 语言不同: JDBC 使用是基于关系型数据库的标准 SQL 语言。 HIbernate 使用是 HQL 语言
操作的对象不同:JDBC 操作的是数据,将数据通过 SQL 语句直接发送的数据库中执行, Hibernate 操作的是持久化对象,有第吃了个持久化对象的数据更新到数据库中
数据状态不同:JDBC 操作的数据时瞬时的,变量的值无法与数据库中值保持一致,而 Hibernate 操作的数据时可持久化的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致
关于Hibernate 的 orm 思想你了解多少?
ORM 指的是对象关系型映射,指的就是我们通过创建实体类对象和数据库中的表关系进行一一对应,来实现通过操作实体类对象来更改数据库里边的数据信息,这里边起到关键作用的是通过 HIbernate 的映射文件 +Hibernate 的核心配置文件
get 和 load 的区别
1.get 是立即加载, load 是延时加载
2.get 会先查一级缓存,在查二级缓存,然后查数据库; load 会先查一级缓存,如果没找到,就创建代理对象,等需要的时候去查询二级缓存和数据库,(这里体现 load 的延迟加载的特性)
3.get 如果没有找到会返回 null,load 如果没有找到会抛出异常
4. 当我们使用 session.load 方法加载一个对象时,此时并不会发出 SQL 语句,当前得到得这个对象其实是一个代理对象。这个代理对象只保存了实体对象的 id 值,只有当我们使用这个对象,得到其它属性时,这个时候才会发出 SQL 语句,从数据库中去查询我们的对对象,相当于 load 的延迟加载方式。 get 就直接的多,当我们使用 Session.get ()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出 SQL 语句从数据库中查询出来
如何进行Hibernate 的优化
1. 数据库设计调整。
2.HQL 优化
3.API 的正确使用
4. 主配置参数(日志,查询缓存, fetch_sieze,batch_size ) .
5 。映射文件优化( ID 生成策略,二级缓存,延迟加载,关联优化)
6. 一级缓存的管理
7. 针对二级缓存,还有许多特有的策略
8. 事务控制策略