1.个人理解
Hibernate是一个优秀的对象关系映射(ORM)的持久层框架,它对jdbc进行了轻量的封装。
我们不用对增删改等数据库操作写额外的sql语句,Hibernate帮我们封装好了。
对象关系映射就是将实体的字段和数据库表的字段一一匹配,操作实体就相当于操作数据库表,最明显的特征就是hql语句。
每个对象实体,都可以通过@Entity注解,以及@Table,@column注解和数据库进行匹配。
Hibernate是跨数据库的框架,它可以通过设置方言来和各种数据库进行匹配
在Hibernate中如果需要查询多表的多条数据,可以使用DTO对象来接收,但是在写hql语句的时候,DTO对象必须是类的全路径。在hql语句中如果需要关联其他实体进行查询,不能用left join on ,只能通过join 对象.属性来进行查询。
hql语句存在局限性,在超过3连表查询时会出现异常,这时可以用个session.creatNativeQuery对象来用sql语句查询
hibernate中的实体有3个状态:
1.瞬时状态:新new出来的对象,与session物管
2.持久状态:从session中取出的对象,并且session没有关闭
3.游离状态:从session中取出的对象,但是session关闭了
说道这就必须了解hibernate的两个缓存:
1.一级缓存:它是session级别的缓存,可以通过封装好的方法对缓存就行清空等操作,持久化对象改变属性,数据库里的字段对应的值也会发生变化,应为持久化的对象发生了改变,一级缓存也会相应的发生改变,数据库会和一级缓存保持一致。所以这就存在了一个时差的问题。
2.二级缓存:二级缓存是sessionFactory级别的缓存,二级缓存是通过第三方插件来引入。
一级缓存,单个会话的对象缓存
二级缓存,可插拔的缓存插件
缓存:我们知道常见的数据库,比如oracle、mysql等,数据都是存放在磁盘中。
虽然在数据库层也做了对应的缓存,但这种数据库层次的缓存一般针对的是查询内容,而且力度也太小,一般只有表中数据没有变更的时候,数据库对应的cache才发挥了作用。
但这并不能减少业务系统对数据库产生的增、删、查、改的庞大IO压力。
所以数据库缓存技术在此诞生,实现热点数据的高速缓存,提高应用的响应速度,极大缓解后端数据库的压力。
缓存不能用于频繁更新的数据,因为缓存是异步的,但是缓存可大大提高查询效率
当session加载或保存一个对象时,如果session的缓存中不存在相应的对象,hibernate就会把该对象加入到一级缓存中。
当再次通过session加载相同OID的对象时,Hibernate将直接从session的缓存中获取。
当session关闭时,缓存将被清空。
作用:
1.减少访问数据库的频率
2.保证缓存中的对象与数据库相关的记录同步。
evict(Object o);指定清空某个对象
clear();清空缓存
二级缓存的执行机制
应用程序--一级缓存--二级缓存--数据库
二级缓存是可配置的插件,hibernate允许选用以下类型的缓存插件
1.EHCache
2.OSCache
3.SwarmCache
4.JBossCache
这些插件都是由第三方提供的
二级缓存策略 usage设定
transaction 事务缓存,可支持事务回滚
read-only缓存的对象只可以读取
read-write缓存的对象可读写
在使用二级缓存时需要开启二级缓存
session.creatQuery("").setCacheable(true).list();
Hibernate的配置