zoukankan      html  css  js  c++  java
  • (转)Hibernate框架基础——在Hibernate中java对象的状态

    http://blog.csdn.net/yerenyuan_pku/article/details/52760627

    在Hibernate中java对象的状态

    Hibernate把对象分为4种状态:

    • 临时状态
    • 持久化状态
    • 游离状态
    • 删除状态

    Session的特定方法能使对象从一个状态转换到另一个状态。

    临时对象(transient)

    • 在使用代理主键的情况下,OID通常为null。
    • 不处于Session的缓存中。 
      Session里面是有一个集合的,这个集合我们称为Session的缓存,叫做一级缓存,它会引用Session要管理的对象。
    • 在数据库中没有对应的记录。

    在以下情况下,Java对象进入临时状态。

    • 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。

    持久化对象(也叫”托管”)(Persist)

    • OID不为null。
    • 位于Session缓存中。
    • 持久化对象和数据库中的相关记录对应。
    • Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
    • 在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象。

    Session的许多方法都能够触发Java对象进入持久化状态:

    • Session的save()方法把临时对象转变为持久化对象。
    • Session的load()或get()方法返回的对象总是处于持久化状态。
    • Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
    • 当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。

    游离对象(也叫”脱管”)(Detached)

    • OID不为null。
    • 不再处于Session的缓存中。
    • 一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录。
    • 修改此状态对象时数据库不会有变化。

    Session的以下方法使持久化对象转变为游离对象:

    • 当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
    • Session的evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当Session的缓存中保留了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。

    删除对象(Removed)

    • OID不为null。
    • 从一个Session实例的缓存中删除。
    • 执行了delete()后的对象。
    • Session已经计划将其从数据库删除,Session在清理缓存时,会执行SQL delete语句,删除数据库中的对应记录。
    • 一般情况下,应用程序不该再使用被删除的对象。

    对象的状态转换说明

    对象的状态转换图: 

    对象的状态总结

    状态Session缓存存在对应的记录数据库中存在对应的记录
    临时状态 no no
    持久化状态 yes 可能有也可能没,如:Customer c=new Customer(); session.save(c); // 持久对象,但数据库中没有
    游离状态 no 可能有(数据没有删除)也可能没有
  • 相关阅读:
    ECshop 二次开发模板教程4
    ECshop 二次开发模板教程3
    ECshop 二次开发模板教程2
    ECshop 二次开发模板教程1
    ecshop 二次开发及模板标签
    ECSHOP seo修改建议
    Ecshop ajax 局部刷新购物车功能
    ECSHOP
    echo二次开发 ecshop 函数列表
    Ecshop文件结构,二次开发
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6963442.html
Copyright © 2011-2022 走看看