• 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操作)。

  • 相关阅读:
    [转]windows7远程桌面连接失败:发生身份验证错误。要求的函数不受支持
    SNMP协议学习笔记
    Sublime for MacOS 使用技巧
    Git常用操作
    罗技K380连接Win10(MacBookPro双系统)系统失败
    Git知识点汇总
    开发工作中提高效率的一些方式
    css
    IO多路复用
    进程
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3891462.html
Copyright © 2020-2023  润新知