虽然目前mytabis用得比较多,但Hibernate相对比较容易上手,而且也有不少公司在用,所以本文就用这个举例,事实上,本文给出的面试建议也适用于各种ORM。本文摘自java web轻量级开发面试教程。
千军易得一将难求军,同样的,收集面试题容易,但要能合理地整理面试题最大限度展示自己的能力,这就需要技巧了。本人之前的一篇博文在面试中如何展示虚拟机和内存调优技能就属于展示面试技巧,这篇文章也是。
首先,大家得了解一些基础知识,以Hibernate为例,大家可以准备如下的问题,这些答案比较简单,建议大家自己找,以加深印象。
问题1,在项目里,你是怎么实现数据表和Java Model类之间的映射?
可以通过配置文件,也可以通过注解。
问题2,在Hibernate里,有哪些主键的生成方式?在项目里你用到的是哪些方式?
问题3,在Hibernate里,有临时对象,持久化对象和游离对象这三类,你了解多少?通过项目里的例子举例说明这三种状态?
首先你得对Session的方法有一定的了解,其次你得知道这些方法对状态的影响,比如调用save后会变什么状态。
问题4,通过HQL语言,如何执行带where,group by的操作,如何通过HQL执行表之间的关联操作。
问题5,如何在Hibernate里执行SQL语句。
问题6,通过Criteria对象,如何设置查询条件,如何设置分组?
在Hibernate(或者其它ORM框架)方面,一般我会给候选人分两个级别,第一是会用Hibernate干活,能在项目经理带领下做项目,如果需要的是初级程序员,那么达到这个标准就行了。
第二个级别高级程序员,要求是不仅要熟悉Hibernate的用法,更重要的是,能根据项目里数据表的需求,适当地选用技术种类,而且,一旦出现性能问题,能知道怎么排查和调试。
面试之前,通过看简历,如果我发现该候选人Hibernate经验不足1年半,或者最近半年没有用到这个,我更会着重问些技术上的细节,由此来确认他在ORM方面的能力,毕竟一些技能要靠多使用来积累的。
首先我会通过如下问题来了解选人在项目里使用Hibernate的基本情况。
1 在项目里,你们用的是哪个版本?对应的数据库是什么?
2 你们是用注解还是配置文件的方式编写映射文件?
3 在项目里,你们大多是用HQL还是SQL的方式获取数据?
4 你们项目的数据规模是多大?一张表里最多有多少数据?你们项目里通过Hibernate装载的数据量一般是多少?
这些问题纯粹是确认候选人在简历上描述的信息,一般只要用过Hibernate做过项目的,都能说上来。
随后我会深入地提问如下的问题。
1 在项目里你们有没有用到过一对一,一对多或多对多关联?相关的配置文件该怎么写?
如果候选人在项目里确实没怎么用过,只要说出合适的理由,比如有人说,他的项目数据量比较少,业务比较简单,项目经理认为没有必要用,那么我也会认可。
2 在配置一对一, 一对多或者多对多时, cascade和inverse该怎么配?结合项目需求告诉我inverse该配在一方还是多方?
3 在一对多或者多对多的情况下,在一方这端,你们是用set还是list还是map或是其它什么类型来装载多方的数据?说明选用的理由。
4 告诉我Session缓存里的三种对象状态,同时我会深入问session的一些重要方法(比如flush,save,persist,clear,evict)的作用。或者我会问,save、persist和saveOrUpdate这三个方法的不同之处。总之我会想方法确认候选人掌握了让对象在三种状态之间转换的对应的Session里的方法。
5 Session里load和get方法有什么差别?比如在一对多情况下,如果在加载一方的时候,我不想加载多方,那么我该怎么办?通过这个问题,我能确认候选人是否具备基本的调优技能。
6 在项目里,你们是否用到了Hibernate的拦截器或者是监听器?为什么要用?在拦截器和监听器里,你们实现了什么功能?
如果候选人在项目里没用过,这个不会成为扣分项,如果用过,而且在拦截器和监听器里加入的功能确实有必要,那么这个会成为加分项。
可能再问些基础问题,比如在Hibernate里你们怎么实现事务?你们一般用到了哪些注解?主键生成策略是什么?
上述问题是用来考察候选人是否达到第一个级别(能否用Hibernate来干活),如果我们要招一个初级程序员,那么达到这个标准就可以了。
我一般会用性能调优方面的问题来区分初级和高级程序员,因为在操作数据时,性能是一个不可或缺的指标项。
1 你们项目里用到的是一级还是二级缓存?如果是用到二级缓存,那么用到的是什么组件?一般你们是把项目里的什么数据放入二级缓存?
我会确认候选人是否把适当的数据放入二级缓存,如果候选人没有用到二级缓存,那么也不要紧,但我会通过其它问题来考察性能优化的知识点。
2 这是个开放性的问题,在Hibernate里,你们在性能优化方面,做了哪些方面的事情?或者你们在写代码的时候,如何保证Hibernate操作数据库的性能?
3 你们在项目里,一般怎么监控Hibernate操作数据库的性能?
这个问题也没有标准答案,但一般是项目都会监控数据库。
具体的措施可以是输出各SQL的运行时;也可以监控数据库本身,比如一旦连接数过多,或者出现死锁情况,发报警邮件;也可以监控项目内存和数据库所在服务器的内存使用情况,如果使用量过高,发报警邮件。
4 在你们项目里,一旦出现性能问题,你们怎么排查定位?
一般是会在各方法运行前后打印时间戳和内存使用情况,出现问题后通过看日志可以定位到究竟是哪个方法哪个SQL(HQL)导致的问题。