(转)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 | 可能有(数据没有删除)也可能没有 |
(转)Hibernate框架基础——在Hibernate中java对象的状态的更多相关文章
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- (转) Hibernate框架基础——操纵持久化对象的方法(Session中)
http://blog.csdn.net/yerenyuan_pku/article/details/52761021 上一篇文章中我们学习了Hibernate中java对象的状态以及对象的状态之间如 ...
- 框架基础之Hibernate简介
框架基础之Hibernate简介 1.什么是Hibernate? Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来 ...
- Hibernate框架基础
Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle…) M,Mapping 映射 OR ...
- (转)Hibernate框架基础——一对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即 ...
- Hibernate中Java对象的三种状态
Hibernate中Java对象的三种 ...
- Hibernate中Java对象的生命周期
一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...
- Hibernate中的对象有三种状态
Hibernate中的对象有三种状态: 瞬时状态 (Transient),持久状态 (Persistent), 1. 脱管状态 (Detached) 1. 1. 瞬时状态 (Transient) 由 ...
- jsp九大内置对象与servlet中java对象
jsp九大内置对象 request对象 : getParameter(String name)获取表单提交的数据 getParamegerNames() 获取客户端提交的所有参数名 getAttri ...
随机推荐
- Mybatis错误——Could not find parameter map java.util.Map
错误信息 org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map java.util.Ma ...
- 《Linux内核分析》MOOC课程
http://www.cnblogs.com/wickedpriest/p/4315189.html
- Android GIS开发系列-- 入门季(6)GraphicsLayer添加文字与图片标签
一.GraphicsLayer添加图片 GraphicLayer添加图片Graphic,要用到PictureMarkerSymbol,也是样式的一种.添加代码如下: Drawable drawable ...
- mvc使用mongodb时objectId序列化与反序列化
前面有写使用自己的mvc 序列化工具即jsonNetResult.我这里结合之前写的jsonNetResult来做一个Json序列化工具,而且序列化ObjectId成一个字符串.详细代码例如以下 us ...
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
- C++学习之函数模板与类模板
泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++ ...
- python 执行shell
一.import os ex: 1.os.system('ls') ----并不能得到返回值 2.output = os.popen('ls') res = output.read() ----能得到 ...
- 通过代码获取log4net的文件路径
http://stackoverflow.com/questions/1343749/get-log4net-log-file-in-c-sharp Solution is quite easy in ...
- 洛谷 P4178 Tree —— 点分治
题目:https://www.luogu.org/problemnew/show/P4178 这道题要把 dep( dis? ) 加入一个 tmp 数组里,排序,计算点对,复杂度很美: 没有写 sor ...
- oracle更新大量数据太慢,可以通过游标实现的例子
declare cursor city_cur isselect t.new_customer_id,t.old_customer_id from citsonline.crm_customer_tm ...