Hibernate学习二:Hibernate对象状态及转换

一.Session的参与

  1. 普通对象就两种状态:new出一个对象,还有生命的状态;不被任何变量引用,被GC回收,死亡状态。
  2. 本文讨论的三种状态:在hibernate session的干预下,在这个对象和数据库的某条记录相关联的条件下,“new出一个对象,还有生命的状态”会演变成三种更加具体的状态:临时状态transient,持久化状态persistent,游离状态detached

 

二. 临时状态  

     刚刚new出一个实体对象的时候,该对象未和任一条数据库记录想关联(也就是对象未和任何一个session相关联,对象没有主键这一持久化标识),此时的状态时临时状态。 

  1. 临时状态的特点:
    1. 未和任何session相关联。
    2. 未和任一条数据库记录相关联。
  2. 临时状态的转换
    1. new一个对象,此对象处于临时状态。
    2. session.delete(持久化对象或者游离状态对象)时,持久化对象或者游离状态对象变成临时状态对象。对于持久化对象,delete删除其在数据库对应的记录,并删除此对象在session中的缓存;对于游离态对象,delete删除其在数据库对应的记录。

 

三. 持久化状态  

      持久化对象是指实体对象处于由Hibernate框架所管理的状态,实体对象被纳入Hibernate实体容器中加以管理。

  1. 持久化状态的特点
    1. 持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后才在数据库中真正运行SQL进行变更,持久对象的数据才会与数据库进行同步。同步之前的持久对象称为脏(dirty)对象
    2. 数据库里面有某一条记录与持久化对象相对应。
  2. 持久化状态的转换
    1. session的save()方法把对象从临时状态转换成持久化状态。
    2. session的load()方法和get()方法返回的对象也是持久化状态。
    3. session的find()方法返回的list对象也是持久化状态。
    4. session的update() saveorUpdate() lock()方法是对象从游离状态转换持久化状态。
    5. 一个持久化状态对象级联一个临时状态对象,保存这个持久化状态时,同时会保存这个临时状态,临时状态对象转换成持久化状态对象。

 

四.游离状态  

     与持久对象关联的session被关闭后,对象就变成游离状态。

  1. 游离状态的特点
    1. 不被任何session关联;如果没有变量引用此对象的情况下,GC回收此对象。这个和临时状态是一样的。
    2. 比临时状态多了一个与数据库标识的OID。
  2. 游离状态的转换
    1. session.close()方法,finally里面会调用persistenceContext.clear(),导致session的缓存被清空,所有的持久化对象变成游离态对象。
    2. session.evict(Object obj)方法,清空一个对象,该对象由持久态变成游离态。当session中保存了大量缓存对象时,手动调用evict(Object ob)方法可以减少缓存,但不推荐。
    3. session.clear(),会调用persistenceContext.clear(),清空所有缓存。

五.总结 

     以下面一张状态转换图作为总结,图片来源无从考证,在此谢谢绘图者。

Hibernate学习二:Hibernate对象状态及转换

你可能感兴趣的:(Hibernate)