Hibernate 理解分析hibernate的三种状态

一、三种状态

  • 临时状态(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)  评论(0)    收藏  举报