对象状态
-
瞬间态 | 临时态:
- 没有与Hibernate产生关联
- 与数据库中的记录没有产生关联(有关联就是与数据库中的id有联系)
-
持久态:
- 与Hibernate产生关联
- 对象有Id,与数据库中的记录有关联
-
游离态 | 托管态:
- 没有与Hibernate产生关联
- 对象有Id,与数据库中的记录有关联
-
三种状态的转换:
-
瞬时–》持久
-
瞬时–》游离
-
持久–》瞬时
-
持久–》游离
-
游离–》瞬时
-
游离–》持久
-
三种状态的作用
- 持久状态,我们使用Hibernate主要是为了持久化我们的数据.
- 对于对象的状态,我们期望我们需要同步到数据库的数据,都被装换成持久状态
- 持久化状态特点: Hibernate会自动将持久化状态对象的变化同步到数据库中.
-
一级缓存
-
Hibernate缓存:
- 用来提高效率
- Hibernate的两种缓存:
- Session缓存(一级缓存)
- Hibernate缓存(二级缓存)
-
简介:
- 一级缓存:又称为session级别的缓存。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(PO对象),为程序优化服务,如果之后需要相应的数据,hibernate优先从session缓存中获取,如果有就使用;如果没有再查询数据库。当session关闭时,一级缓存销毁。
-
演示:
-
一级缓存快照
-
发现不同:
-
原理:
-
-
一级缓存的细节:
- HQL查询不会使用一级缓存。
- HQL语句批量查询的时候,结果会进入缓存。
- sql查询如果把结果封装到对象中,对象会放入一级缓存,如果没有,则对象不会放入缓存中。
- 如果生成策略自增的情况下,如果在save或者persist方法之前设置了ID(主键)则
- persist(持久) 方法 来自于JPA 接口将对象完整的持久化. 持久化也包括对象的ID。在保存之前设置了ID,那么就会将设置的ID进行insert. 但是 主键策略是由数据库来维护. 所以产生矛盾.所以抛出异常.
- save(保存) 方法来自于Hibernate 所以如果保存的对象在保存之前设置了ID.那么该ID也被认为是无效的ID.
-
其他API
- clear()方法:清除一级缓存
- refresh()方法:刷新,强制刷新缓存中的对象,只能解决部分缓存与数据库中的数据不一致的现象
- flush()方法:对比快照,并提交缓存对象 (立刻提交到数据库)
总结
通过缓存,可以更加深入的了解Hibernate框架,并且减少了不必要的代码重复。