[Java面试]四:常见面试题之框架篇Hibernate

我的博客首页:http://blog.csdn.net/m0_37116405
我的GitHub首页:https://github.com/KissLouis

  1. 为什么要使用Hibernate开发你的项目呢?
    1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
    2. Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM 实现。他很大程度的简化DAO层的编码工作
    3. hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
  2. Hibernate的开发流程是怎么样的?
    1. 读取并解析配置文件
    2. 读取并解析映射信息,创建SessionFactory
    3. 打开Session
    4. 创建事务Transaction
    5. 数据库持久化操作
    6. 提交事务
    7. 关闭Session
    8. 关闭SessionFactory
  3. ORM(Object Relational Mapping)对象关系映射
    1. 编写程序的时候,以面向对象的方式处理数据
    2. 保存数据的时候,以关系型数据库的方式存储数据
  4. Hibernate缓存机制
    1. 一级缓存
      1. 又称作是”Session的缓存”,默认开启,不能关闭
      2. Session对象的生命周期通常对应一个数据库事务或者一个应用事务,缓存与缓存之间相互独立
      3. 每个缓存都有唯一的OID
    2. 二级缓存
      1. SessionFactory的缓存,是应用级别的缓存
      2. 由于SessionFactory对象的生命周期与应用程序对应,通常是在应用启动时就创建好的。
      3. 作为一个单个的数据存储,它也是 线程安全的,所以多个线程可同时使用同一个SessionFactory。
      4. 因此Hibernate二级缓存是进程范围或者集群范围的缓存
    3. Hibernate缓存工作原理
      1. 当Hibernate根据ID访问数据对象的时候,首先从Session的一级缓存中查询;
      2. 查不到,如果配置了二级缓存,那么从二级缓存中查询;
      3. 如果都查询不到,再查询数据库。把结构按照ID放入到缓存,且增删改操作的时候,同时更新缓存。
  5. Hibernate中load和get的区别
    1. Get:立即加载类不受lazy影响,如果找到了则返回真实对象,找不到则返回null,类级别可以脱离session使用
    2. Load:默认延迟加载类受lazy影响,如果找到了则返回代理对象,找不到则抛出异常,中断程序。不可以脱离session使用
  6. Hibernate的优缺点
    1. 优点
      1. hibernate可以让开发人员以面相对象的思想来操作数据库。
      2. 支持数据库更好的移植性。
      3. 开发效率高。开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。(其实这也是Hibernate的缺点)
      4. hibernate提供了缓存机制,提升了性能。
    2. 缺点
      1. 由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。
      2. 框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的
      3. 如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
  7. 如何优化Hibernate
    1. 使用双向一对多关联,不使用单向一对多
    2. 灵活使用单向一对多关联
    3. 不用一对一,用多对一取代
    4. 配置对象缓存,不使用集合缓存
    5. 一对多集合使用Bag,多对多集合使用Set
    6. 继承类使用显式多态
    7. 表字段要少,表关联有二级缓存不需要怕多

常见面试题,还需补充。
如果本篇博文中存在问题,烦请指出,本人及时修改,谢谢阅读!

你可能感兴趣的:(java,面试)