前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢。说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧。今天就先说说Hibernate对象的三种状态,Hibernate对象有三种状态,分别是:临时态(Transient)、 持久态(Persistent)、游离态(Detached)。

临时状态:是指从对象通过new语句创建到被持久化之前的状态,此时对象不在Session的缓存中。

处在此状态的对象具备以下特点:

1,不在Session缓存中,不与任何Session实例相关联。

2,在数据库中没有与之对应的记录。

通常在下列情况下对象会进入临时状态:

1,通过new语句创建新对象。

2,执行delete()方法,对于游离状态的对象,delete()方法会将其与数据库中对应的记录删除;而对于持久化状态的对象,delete()方法会将其与数据库中对应的记录删除,并将其在Session缓存中删除。

例如:Object object = new Object();

此时object为临时状态,数据库中没有对应的数据,Session缓存中也没有相关联的实例。

持久化状态:是指对象被持久化到Session对象被销毁之前的状态,此时对象在Session的缓存中。

处在此状态的对象具备以下特点:

1,在Session缓存中,与Session实例相关联。

2,在数据库中有与之对应的记录。

3,Session在清理缓存的时候,会根据持久化对象的属性变化更新数据库。

通常在下列情况下对象会进入临时状态:

1,执行save()或saveOrUpdate()方法,使临时对象转变为持久化对象。

2,执行upda()或saveOrUpdate()方法,使游离对象转变为持久化对象。

3,执行load()或get()方法,返回的对象都是持久化对象。

4,执行find()方法,返回List集合中存放的都是持久化对象。

5,在允许级联保存的情况下,Session在清理缓存时会把与持久化对象关联的临时对象转变为持久化对象。

例如:Session session = factory.openSession();  object.setName("持久化对象"); session.save(object);

此时object对象为持久化对象,Session缓存中有相关联的实例,数据库中有相应的记录。

游离状态:是指从持久化对象的Session对象被销毁到该对象消失之前的状态,此时对象不在Session的缓存中。

处在此状态的对象具备以下特点:

1,不在Session缓存中,不与任何Session实例相关联。

2,在数据库中有与之对应的记录(前提是没有其他Session实例删除该条记录)。

通常在下列情况下对象会进入临时状态:

1,执行close()方法,将Session缓存清空,缓存中的所有持久化对象将转变成游离对象。

2,执行evict()方法,能从缓存中删除一个持久化对象,使之转变成游离对象。

例如:session.close();

此时上文的object对象为游离对象,Session缓存中没有有相关联的实例,数据库中有相应的记录。

三种状态之间的转换过程

对上图的解析:

1,当一个对象被new了以后此对象处于临时态(Transient)。

2,然后对此对象执行session的save() 或者saveOrUpdate()方法后,此对象被放入session的一级缓存进入持久态。

2,当再对此对象执行evict()/close()/clear()的操作后此对象进入游离态(Detached)。

4,游离态(Detached)和临时态(Transient)的对象由于没有被session管理会在适当的时机被java的垃圾回收站(garbage)回收。

5,执行session的get()/load()/find()/iternte()等方法从数据库里查询的到的对象,处于持久态(Persistent)。

6,当对数据库中的纪录进行update()/saveOrUpdate()/lock()操作后游离态的对象就过渡到持久态。

7,处于持久态(Persistent)与游离态(Detached)的对象在数据库中都有对应的记录。

8,临时态(Transient)与游离态(Detached)的对象都可以被回收可是临时态的对象在数据库中没有对应的纪录,而游离态的对象在数据库中有对用的纪录。

三种状态在程序的转换过程:

代码

对象的生命周期状态

对象的状态

Object object = new Object();

开始生命周期

开始生命周期

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction();

在生命周期中

临时状态

session.save(object);

在生命周期中

转变为持久化状态

tx.commit();

在生命周期中

持久化状态

session.close();

在生命周期中

转变为游离状态

System.out.println(object.getName());

在生命周期中

游离状态

object = null;

结束生命周期

结束生命周期

三种状态里面,只有持久化状态在Session缓存中有相关联的实例,临时状态跟游离状态都没有。临时状态数据库里没有对应的记录,其他两种可能又记录,也可能没有记录。

好了,Hibernate对象的三种状态就说到这里,接下来可能跟大家说说Hibernate的Session,期待不?

菜鸟学SSH(八)——Hibernate对象的三种状态的更多相关文章

  1. hibernate对象的三种状态

    对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...

  2. Hibernate 对象的三种状态

    hibernate对象的三种状态: (一) 瞬时(临时)状态:   对象被创建时的状态,数据库里面没有与之对应的记录! (二) 持久状态:   处于session的管理中,并且数据库里面存在与之对应的 ...

  3. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  4. hibernate操纵数据库常用方法 及 hibernate对象的三种状态

    在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...

  5. Hibernate对象的三种状态,瞬时态、持久态、游离态

    1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...

  6. hibernate对象的三种状态及转换

    一.hibernate对象三种状态 Transient(瞬时状态):没有session管理,同时数据库没有对应记录 举例:new 出来的对象还没有被session管理,此时该对象处于Transient ...

  7. [转]Hibernate对象的三种状态

    在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...

  8. 分享知识-快乐自己:Hibernate对象的三种状态

    图解: 1):瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据. 一般new出来的对象便是瞬时对象. 对瞬时对象使用save()方法便使之成为持久对象. 由于数据库 ...

  9. Hibernate(六)__对象的三种状态

    瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...

随机推荐

  1. 关于Java中子类调用父类方法

    当一个类继承于另一个类,子类中没有父类的方法时.用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...

  2. C#让控制台程序不显示闪退窗口的方法

    新建一个控制台程序,然后编译为 窗体程序.即可........

  3. oracle11g-R2静默安装报错[INS-32013]解决方案

    问题描述: oracle静默安装很强大...,参数搞不对.安装就扯dan了....这个报错搞了一个下午.终于搞定了如释负重.... 如果当初选择仅仅安装oracle软件就没多事情.想一步完成(数据库软 ...

  4. Qt中运行后台线程不阻塞UI线程的方案

    有一个想法,一个客户端,有GUI界面的同时也要向网络服务器发送本地采集的数据,通过网络发送数据的接口是同步阻塞的,需要等待服务器响应数据. 如果不采用后台线程的方案,用主UI线程关联一个定时器QTim ...

  5. Linux下的二进制兼容性的检测

    都知道Linux的二进制兼容与windows相比简直是天差地别,windows的二进制兼容做得特别好,很老的游戏都能在windows 10上跑,写的好的程序,在XP上也不是不可以.但是Linux就不一 ...

  6. Python字典按值排序的方法

    Python字典按值排序的方法: 法1: (默认升序排序,加  reverse = True 指定为降序排序) # sorted的结果是一个list dic1SortList = sorted( di ...

  7. Ant scp upload文件至linux server(用java调用Ant api)

    1.要准备的jar包:ant.jar,ant-jsch.jar code: package com.test.utils; import org.apache.tools.ant.Project; i ...

  8. Jquery 数组操作(转)

    在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...

  9. C# Random 生成不重复随机数

    命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它们是用一种确定的数 ...

  10. 【转】Swift 语言的设计错误

    Swift 语言的设计错误 在『编程的智慧』一文中,我分析和肯定了 Swift 语言的 optional type 设计,但这并不等于 Swift 语言的整体设计是完美没有问题的.其实 Swift 1 ...