1、get()和load() 的区别
1) 发送sql的时机: load是延迟加载 get是立即加载;
2) 运行出错后, get方法抛异常为NullPointException,返回的是null,此null是一个真实的对象。而load方法报ObjectNotFoundException,它返回的是一个代理对象。
3) get会先查一级缓存, 再查二级缓存,然后查数据库;load会先查一级缓存,如果没有找到,就创建代理对象, 等需要的时候去查询二级缓存和数据库。
2、hibernate的一级缓存是什么?
hibernate的一级缓存也就是session级别的缓存。在session接口的实现中包含了一系列的Java集合,这些Java集合构成了session缓存。只要session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期。
3、Hibernate工作原理及为什么要用?
原理:
1).读取并解析配置文件
2).读取并解析映射信息,创建SessionFactory
3).打开Sesssion
4).创建事务Transation
5).持久化操作
6).提交事务
7).关闭Session
8).关闭SesstionFactory
为什么要用:
.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的 ORM实现。他很大程度的简化DAO层的编码工作
.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
4、inverse的好处
在关联关系中用inverse在控制由哪一端来控制关联关系。这样做有什么好处呢?举customer和order的例子来说。他们是一对多的关系,如果只单向关联,且由customer控制关联关系,则如果我想添加一个order,则先取customer, 然后getOrders得到所有的order集合,然后往集合里面多加入一个order,然后save(customer), 这样开销太大。 如果改双向关联且由order主控关系,则如果想为customer增加一个order, 则new一个order,然后给order设置customer,然后save(order)即可。
5、如何优化hibernate
使用双向一对多关联,不使用单向一对多
灵活使用单向一对多关联
不用一对一,用多对一取代
配置对象缓存,不使用集合缓存
一对多集合使用Bag,多对多集合使用Set
继承类使用显式多态
表字段要少,表关联不要怕多,有二级缓存撑腰
6、刷出缓存与刷新缓存
刷出缓存: session能够在某些时间点,按照缓存中对象的变化来执行相关的sql语句,来同步更新数据库
刷新缓存:让session中的数据与数据库中的数据保持一致