(一)持久化
(1)持久化类
- 持久化类:JavaBean+对应映射的配置文件(xxx.hbm.xml)
- 规范
- 提供一个无参的构造方法
- 属性提供get和set方法
- 基本数据类型建议使用包装类
- 提供OID(Object Identifier),一个标识属性,映射数据库的主键
(2)主键
- 自然主键:是对象本身的一个属性
- 代理主键:不是对象本身的一个属性,而是单独创建的一个字段
(3)MySQL方言
当MySQL版本为5时,使用
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
,才能在数据库中成功创建表
(4)主键生成策略
- 关于xx.hbm.xml中
中< id >生成策略 - increment,不适用于并发场景
- identity,要求数据库主键auto_increment,不适用于Oracle
- sequence,不适用于MySQL
- native,Hibernate根据底层数据库不同自动采用identity或sequence的一种作为主键生成策略
- 适用于short、int、long类型主键
- uuid,适用于String类型的主键
- 比如生成的id为8a0afb2766a5b0a90166a5b0abd00000
- assigned,主键自定义维护
<id name="id" column="id">
<!--
increment:获取数据库主键的max,max+1之后返回
-->
<generator class="increment"/>
</id>
(5)持久化对象状态
- 将一个实例化对象保存到数据库的过程中,持久化对象会以此经过下面三个状态
- 瞬时状态
- 通过new创建的对象实体,没有被session管理(没有OID的值)
- 持久状态
session.save(Javabean)
之后,持久化对象有OID的值
- 脱管状态
session.close()
之后,持久化对象没有被session管理
- 关键是区分OID和是否被session管理
(6)持久化对象状态转换☆
如果了解持久化对象状态的含义,状态之间的转换就很容易弄懂
- 得到瞬时态:调用new
- 瞬时态→持久态:session.save() or session.saveOrUpdate()
- 持久态→脱管态:session.close()
- 脱管态→持久态:
update()
关于状态转换图参考:https://blog.csdn.net/qq_36748278/article/details/78057575
(1)持久态
- 对于持久态的对象,如果更新对象的值,会自动将更新保存到数据库
- 原因:Session一级缓存
(二)缓存
(1)Session一级缓存
- Session缓存
- 程序从内存中读取持久化对象,而不用访问数据库
- 优点:减少对数据库的直接访问,提高数据的访问速度
- 利用控制台信息可以间接证明缓存存在
- Session快照
- 作用:保持数据一致,自动更新数据库
- 工作流程:如果缓存区域和快照区域值不同,则会修改快照区域,同时更新数据库
- session.clear() :清空session缓存
- session.evict(javabean对象) :清空特定对象缓存
- session.flush() :手动更新缓存
(2)SessionFactory二级缓存
留坑…