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