跳到主要内容

Hibernate 面试官必须出的面试题

1. 前言

本节课先和大家聊聊面试过程中需要注意的事项,再和大家一起讲解 Hibernate 中常见的面试题。

2. 面试技巧

面试官出的面试题一般会有 3 个特点:

  1. 强调原理性: 通过面试者对问题原理性的讲解,可以了解面试者是否真正理解、掌握了相关知识。对于知识而言,用是一个层次,说出来又是一个层次;
  2. 强调基础性: 基础的知识才是永恒的,任何高级的运用都是建立在基础知识之上,通过对基础知识的提问可以了解面试者认知的深浅。是浮于表面,还是扎根源头;
  3. 讲究细节: 很多学生学完后,自我感觉非常好,但是面试题一般都会问到一些学习过程易忽视的细节内容。

面试者解答时,需要掌握 3 个技巧:

  1. 要有专业性: 同一道题目,正确答案只有一个,若干面试者中,为什么面试官选择了他而没有选择你。一个可能性就是答案不专业,没有切到中心点;

有很多面试者,面试完后,自我感觉回答的很好,但没有接到再面试的通知。

有一方面原因是回答的不专业。

  1. 要有自己的见解: 有的人不是在回答问题,而是在向面试官背答案。答案没有错,如果缺少自己的独有理解,如果同时有一个面试者除了给出专业的答案,还附有自己的理解。如果你是面试官,请问你会选择谁;
  2. 要有层次性: 或者说是条理性、逻辑性,答案要有条理。1、2、3 结构明显,脉络清晰。最忌讳杂乱不清。

面试心态,当大家实力相当时,心态就有可能成为决定结果的有利因素:

  1. 不着急,不恐慌;
  2. 相信自己;
  3. 我是来找工作的,我是来找一家值得自己付出的公司,在面试一家能展现自己价值的公司。如果没有被录用,说明还有不足或者说明暂时没有达到这家公司的要求;
  4. 学会放下,有重新再来的勇气。

3. 常见面试题

  1. 简述 Hibernate 的工作流程?

Hibernate 的主要功能是为原生 JDBC 开发提供 2 个自动化操作:构建 SQL 语句和自动封装数据;

  • 使用 Hibernate 时,首先需要通过其 Configuration 组件读取连接数据库的信息;
  • 使用 HibernateSessionFactory 组件完成和数据库系统的对接;
  • 使用 Hibernate 提供的 Session 组件完成相关的数据操作;
  • 使用 Hibernate 提供的 Transaction 组件完成事务管理;
  • 关闭 Session,释放资源。
  1. 简述 Hibernate 的 get 和 load 方法区别?

get()方法直接构建 SQL 语句,访问数据库,获得数据。如果没有获取数据,会返回一个 null。load()方法会生成一个代理对象,只有当调用 get()方法时,才会访问数据。如果数据库中没有数据,则抛出一个 ObjectNotFountdException 异常。

  1. 简述 Hibernate 持久化对象的 3 种状态?

在程序级别初次构建持久化对象时,此时数据库中没有此对象,则可说明此时持久化对象的状态为瞬时或临时状态。

持久化对象经过 Session 组件进行对应的操作后,如 get()、load()、save()等操作后,此时,此持久化对象数据在程序和数据库中都存在,此时的持久化对象处于持久化状态。

当 Session 组件关闭后,虽然此对象的数据在程序和数据库都存在,但已经失去了 Session 对象的管理,则说,则时此对象的状态为脱离状态。

  1. 简述 Hibernate 的缓存机制?

使用缓存的目的是为了减少对数据库的访问次数,提升 Hibernate 的操作效率;Hibernate 提供有 2 级缓存。一级缓存也叫做 Session 的缓存,提供 session 生命周期内的数据缓存操作。当调用 Session 的 save/saveOrUpdate/get/load/list/iterator 等方法的时候,都会把对象放入 Session 缓存中;

因为 Session 生命周期较短,所以,Session 缓存应用价值并不很大。

Session 提供有与缓存管理有关的方法:

  • session.flush(): 让一级缓存与数据库同步;
  • session.evict ():清空一级缓存中指定的对象;
  • session.clear():清空一级缓存中所有的对象。

二级缓存也叫 SessionFactory 缓存, SessionFactory 具有应用程序级别的生命周期,具有实际意义 ,默认情况下并没有启动,需要在主配置文件中做相关设置后再启动。

一般被缓存的数据有如下几个特点:

  • 很少被修改的数据;
  • 不会被并发访问的数据;
  • 经常需要访问的数据;
  • 不会被第三方修改的数据。
  1. 简述 Hibernate 中 getCurrentSession 和 openSession 方法区别?

这 2 个方法都能得到 Session 对象。getCurrentSession 方法本质上还是通过 openSession 返回 Session 对象,区别在于 getCurrentSession 会根据开发者在 Hibernate 主配置文件中的相关配置,延长其在特定事务期间的生命周期。

  1. 简述 Hibernate 的乐观锁和悲观锁?

乐观锁和悲观锁都是并发策略,更好的保证并发过程中事务之间的隔离性。

乐观锁:

优势:性能好,并发性高。

缺点:用户体验不好,可能会出现高高兴兴去更新,却告知已经有人捷足先登了。

悲观锁:

优势:锁住记录为我所用,没修改完成之前,其他事务只能瞪眼瞧着,时间虽然延迟,至少心里有底。

缺点:并发性不好,性能不高。

  1. 简述 Hibernate 的延迟加载机制?

延迟加载是 Hibernate 提供的一种性能优化方案,但是,使用时需要注意,必须保持在 Session 生命周期之内。

Hibernate 中的延迟加载有 2 种情形:

  • 如 load()方法。直接调用 load()方法只会产生一个代理对象,只有当访问属性的 get()方法时,才会访问数据。
  • one-to-many、many-to-one、many-to-many 中也可以设置延迟加载,只有访问与当前查询相关的关系表中的数据时,才会进行数据加载。

因为 Session 生命周期较短,如果要跨组件使用延迟加载功能, 则需保持 Session 生命周期与请求过程相同。WEB 项目开发中,Hibernate 提供的有 OpenSessionInViewFilter 过滤器,用来保证请求开始和响应结束的时候,使用同一个 Session。请求开始创建 Session,响应结束关闭 Session。

4. 小结

好了,本节课和大家聊聊了面试中需要注意的问题,以及一些较常见的面试题目。要记住,你再怎么刷题都是不可能刷完所有的题目,唯有掌握其内在原理,以不变应万变才是上上之策。