一、三种状态
- 临时状态(Transient)
- 持久化状态(Persistent)
- 游离状态(Detached)
二、特征
临时状态
- 使用 new 创建出来的对象,没有设置 id 属性
- 没有被 session 托管,换句话说 对象数据 存放在内存中, 没有存放到 session 缓存中
- 临时对象数据 与 数据库中的数据 还没任何关联
持久化状态
- 要么是从数据库中使用 get 或 load 方法查询到的数据对象, 要么是 使用save 或 update 方法数据转变成持久层对象
- 对象 数据被 session 托管。换句话说 对象数据 在 session 缓存中有一份,在数据库中有相应的记录
游离状态
- 主要是通过 持久状态对象,调用 session.evict() 或 session.clear() 或 session.close() 得到的,也可以new 一个设置 id 值的对象
- session 缓存中没有,内存中有的对象(注: 该对象设置了 id 值)
三、关系图

分析
- 首先 new 一个对象进入临时状态
- 然后将对象交给 session 来托管,这时 session 里已经保存一份,调用 save() 或者 saveOrUpdate() 保存到数据库里
- 当执行修改操作时,内存中的属性和 session 中的所保存的是不一致
- 当执行 commit() 方法时,会默认先调用 flush() 方法,将数据同步到数据库中。此时如果 缓存中的数据 与 数据库中的数据不一致,会发送一条update 语句
- 注意的是如果手动设置了ID属性执行 save() 方法,数据库就会默认生成ID值,而手动设置的 ID 属性最终无效甚至报错,而且报错原因是持久化对象的 ID 是不能修改
- 当设置一个有 ID 值的对象, 然后调用session.delete() 方法删除,如果该对象在 session 缓存中有,那么会先删除 session 缓存中的数据,然后再删除数据库中的数据
- saveOrUpdate 方法是save 方法 和 update 方法结合, 如果对象有 id 那么就调用 update 方法,如果没有id 那么就调用save 方法, 但前提是这个 对象是 在session 缓存中的(注意的是自己手动设置ID值是无效的)
posted @
2021-03-09 01:15
q-linyu
阅读(
121)
评论()
收藏
举报