Hibernate学习_006_Hibernate对象的三种状态
来源:互联网 发布:html js display none 编辑:程序博客网 时间:2024/05/16 17:03
学习Hibernate的时候,通过Session的各种方法操作数据库时,一定会涉及到对象的三种状态。到底Hibernate中对象的三种状态是个什么样的关系,以及对象三种状态之间如何相互的转换,弄清楚这个,对于理解Hibernate的各种持久化操作的细节至关重要。
Hibernate对像的三种状态的关系图如下所示:
那么如何区别对象的三种状态呢?其实最最关键的区别点就在于对象的ID在如下三个地方是否存在:
- 对象的ID在内存中是否存在:持久化状态对象不一定有,脱管状态对象有,瞬态对象一定没有。
- 对象的ID在缓存中是否存在:持久化状态对象不一定有,脱管状态对象没有,瞬态对象一定没有。
- 对象的ID在数据中是否存在:持久化状态对象一定有,脱管状态有,瞬态对象一定没有。
要理解上面的三句话,首先的理解对象,内存,缓存之间的关系,这个其实不复杂,缓存是内存中的一个区块,这个缓存可以理解为Session的一级缓存,而Session中存在一个HashMap,这个Map对象中就存放了各个持久化对象的相关信息,首先,这个Map中的key就存放的是对象的ID属性,Map的value就存放的是指向这个对象的引用。
有了上面的知识,下面我们一步步来分析一个对象 从开始New出来到最后把它Delete的全过程中是怎么和这三种状态关联:
首先,new出来一个对象之后,还没有通过Session保存到数据库的时候,这个时候,内存中是存在这个对象的,但是没有ID属性,缓存和数据库中都没有这个对象的相关信息,这个时候对象的状态就属于脱管状态,当我们把这个对象保存到数据库中的时候,这个时候,内存中的对象就有了ID值,同时数据库中会存放这个对象的完整信息,而且,此时在Session中的Map也会有一个Entity,其key就是这个对象的ID,其value值就是指向内存中的对象的一个引用。这个时候,因为数据库中存在完整信息,而且内存和缓存中均有对象的ID属性存在,对象就是属于持久化状态。这个时候,假设我们关闭Session,这个时候,Session一级缓存中的信息(Map中的信息)就会清空,所以,此时缓存中没有了对象的信息,但是内存和数据库中的信息还是存在的,所以这个时候,对象的状态就属于脱管状态,而如果此时我们是把一个经过持久化过的对象Delete的话(注意一定要有ID,刚刚new出来的瞬态对象,由于没有ID,是无法删除掉的。而且可以通构造一个对象,给其赋予数据库中已经存在的一条记录的ID值,来达到删除数据库中的一条记录的目的。),此时数据库中,缓存中,都不会有对象的信息,但是这个时候内存中还是有这个对象的,这个时候如果再次保存这个对象,会重新会为这个对象分配ID值,这个时候对象的状态就是属于瞬态了。
0 0
- Hibernate学习_006_Hibernate对象的三种状态
- Hibernate学习笔记—Hibernate对象的三种状态
- Hibernate学习笔记(2):对象的三种状态
- Hibernate的对象的三种状态
- Hibernate的对象的三种状态
- Hibernate的三种对象状态
- hibernate对象的三种状态
- hibernate 实体对象的三种状态
- hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- hibernate的三种对象状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate数据对象的三种状态
- Win7/Win8如何修改文件权限
- oracle中 多表查询分析
- fastjson 对于json数组字符串的处理
- 将数据写入到CSV文件
- 用vlc搭建简单流媒体服务器(UDP和TCP方式)
- Hibernate学习_006_Hibernate对象的三种状态
- JNI官方规范中文版——JNI程序设计总结
- 采用axis2方式Java客户端调用WCF服务端Web Service
- 分步注册代码
- 在win7下python的xlrd和xlwt的安装于应用
- RTSP流媒体数据传输的两种方式(TCP和UDP)
- Collection总结
- 【转】ARM获得PC指针为何PC=PC+8[下](转)
- msdn之断点API