zoukankan      html  css  js  c++  java
  • hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念:

    1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据。用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象;

    2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据。已经持久化,增加到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;

    3,  游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。
    特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;

    ×√

    暂时状态

    (Transient)

    持久化状态

    (Persistent)

    游离状态

    (Detached)

    是否处于Session缓存中

    ×

    ×

    数据库中是否有相应记录

    ×

    hibernate3.gif
    游离对象和暂时对象异同:

    两者都不会被Session关联,对象属性和数据库可能不一致;

    游离对象有持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;

    Hibernate和SQL的关系:

    在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,仅仅有Session缓存要被更新时,底层的sql语句才干运行,数据存入数据库;

    以下举例说明:
    一,Session.save(user)执行机理。
    1,把User对象增加缓存中,使它变成持久化对象;
    2,选用映射文件指定的标识生成ID;
    3,在Session清理缓存时候运行:在底层生成一个insert sql语句,把对象存入数据库;

    注意:在你运行Session.save(user)后,在Session清理缓存前,假设你改动user对象属性值,那么终于存入数据库的值将是最后改动的值;此过程中ID不能被改动;

    二,Session.delete(user)执行过程。
    假设user是持久化对象,则运行删除操作,相同底层数据库的运行条件是:在Session清理缓存时候;
    假设user是游离对象:
    1,将user对象和Session关联,使之成为持久化对象;
    2,然后依照user 是持久化对象的过程运行;

    三态之间的转换方法:

    ①怎样成为自由态?对象通过构造方法成为自由态;持久态和游离态则通过session的delete方法成为自由态

    ②怎样成为持久态?对象能够由session的load或get方法直接成为持久态;自由态对象能够通过save,saveOrUpdate或persist方法成为持久态;游离态对象则能够通过update,saveOrUpdate成为持久态

    ③怎样成为游离态?游离态仅仅能由持久态转换而来,通过close或clear方法实现。

    几种转换方法的对照:

    1.get 与load

    都是从数据库中载入数据封装为java对象,使得java对象从自由态直接变为持久态;

    可是有两点差别:①get返回对象能够为null,load返回值则始终不为null,找不到时会抛异常②get即时运行insert,而load则是在使用此对象时才运行insert

    2.save,update与saveOrUpdate

    save是将自由态转为持久态,而update是将游离态转为持久态,saveOrUpdate能够说是两者的综合,它运行时先推断对象的状态(主要是通过有无主键推断的),若是自由态,则save,若是游离态,则update

    3.save与persist

    两者都是将对象由自由态转为持久态,但返回值不同:save返回主键值,而persist不返回

    4,saveOrUpdate与merge

    两者都是将自由态或游离态对象与数据库关联,但merge不改变对象的原有状态

    此外,对clear与flush方法也作介绍。clear是将session中的对象所有变为游离态,是对象由持久态变为游离态的一种方法(第二种是关闭session);flush方法时为了使update操作能即时进行(正常情况下,仅仅有在事务关闭时才进行update操作)。

  • 相关阅读:
    OSI安全体系结构
    PHP 二维数组根据相同的值进行合并
    Java实现 LeetCode 17 电话号码的字母组合
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 14 最长公共前缀
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4275380.html
Copyright © 2011-2022 走看看