【SSH系列】-- Hibernate持久化对象的三种状态
在上一篇博文中,小编主要简单的介绍了【SSH系列】--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占用的内存将被JVM垃圾回收机制收回。在hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。
一、瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下:
a、不在Session的缓存中,不与任何的Session实例相关联。
b、在数据库中没有与之相对应的记录。
二、持久态(Persistent),处于这种状态的对象具备的特征如下:
a、在Session的缓存中,与Session实例相关联。
b、在数据库中存在与之相对应的记录。
三、脱管态(Detached),也叫游离态。处于这种状态的对象具备的特征如下:
a、不在Session的缓存中,不与任何的Session实例相关联。
b、 在数据库中存在与之相对应的记录。(前提条件是没有其他Session实例删除该条记录)。
持久化对象的三种状态是可以相互转化的,具体转换过程如图所示:
图画的有点粗糙,还请小伙伴们多多包涵,接着,小编结合代码实例来更加详细的介绍,这三种状态。
Transient状态
当我们new一个对象是,就是transient状态,最显著的特点是在数据库中没有与之对应的记录。也没有纳入到session 的管理,随时可以被垃圾回收处理掉,代码如下所示:
/*
* user是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的
* 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象
* user就变成了一个Persistent(持久化对象)
*/
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//Transient状态
User user=new User();
user.setName("丁国华");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
Persient状态
当我们对transient 对象进行save(),saveOrUpdate()之后对象进入persient状态,在数据库中有与之对应的记录。纳入了session的管理,session和一级缓存绑定着,session级的缓存通常也叫一级缓存。当save()的时候会放到缓存里一份,可以理解为session里有个map,对象放到了map里面,有对象引用他了,垃圾回收机制是回收不了它的。调用delete(),进入Detached状态,代码如下所示:
/*
* user是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的
* 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象
* user就变成了一个Persistent(持久化对象)
*/
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//Transient状态
User user=new User();
user.setName("丁国华");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//Persistent状态
session.save(user);
Detached状态
当persient对象经过 evict(),close(),clear()方法处理,进入游离态也就是detached状态。detached对象之是将缓存里的记录清理了,数据库里的记录并没清理,没有纳入session管理,随时可以被垃圾回收掉。没有对象引用他~。因为在数据库里有引用记录没清理,所以可以调用update(),saveOrUpdate(),lock()等方法,调方法之后又回到transient状态,代码如下所示:
/*
* 以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的
* 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象
* user就变成了一个Persistent(持久化对象)
*/
Session session=null;
Transaction tx=null;
try {
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//Transient状态
User user=new User();
user.setName("丁国华");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//Persistent状态
session.save(user);
//进行修改操作,修改name=“等一个故事”
user.setName("等一个故事");
//提交事务
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
} finally{
HibernateUtils.closeSession(session);
}
//detached状态
小编寄语:该博文小编主要简单的介绍了持久化对象的三种状态,举个生活的例子,我们可以把数据库比如成,我们常用的onenote,在我们的学习过程中,我们把重要的知识点,记录到onenote当中,更好的编织知识网,更加有利于提高学习效率,还没有被我记录到onenote里的知识点,处于一个游离的状态,把知识点记录到onenote中,这个过程就是持久化。瞬态数据和游离态数据非常的类似,但是有一点,就是她是存在持久化之前的数据,就是说,零散的知识点,还没有被我写进onenote的时候,知识点是瞬态的,记录到onenote中的时候就是持久态,用到的时候查询就是游离态。小编浅浅的理解,有不同意见的小伙伴,可以在下面进行留言,SSH之旅,未完待续......
【SSH系列】-- Hibernate持久化对象的三种状态的更多相关文章
- Hibernate持久化对象的三种状态深入理解
关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...
- Hibernate之对象的三种状态
Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...
- Hibernate中对象的三种状态及相互转化
1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下: Customer customer=new Customer(“ ...
- JavaWeb_(Hibernate框架)Hibernate中对象的三种状态
对象的三种状态 瞬时状态: 实体 没有id.没有与session关联 持久化状态: 特点:持久化状态对象的任何改变都会同步到数据库中 游离态[也称作托管态]: 实体 有id,没有与session关联 ...
- hibernate 实体对象的三种状态以及转换关系。
最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...
- Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】
当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...
- hibernate 持久化对象的三个状态
Hibernate中的对象有3种状态 瞬时对象(TransientObjects).持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象) Tran ...
- hibernate实体对象的三种状态:自由状态,持久状态,游离状态.
自由态与游离态的区别: 当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它 对应的记录,只是现在这个游离对 ...
随机推荐
- IOS开发- 访问通讯录,并将通讯录中姓名-头像-手机号码 发给服务器
现在很多软件都会访问通讯录,并将通讯录的信息取得,发给服务器,然后服务器会返回相应电话号码的用户是否注册. 现在分享一下前两步,访问通讯录并处理通讯录的信息 1.导入框架 #import <Ad ...
- win10配置Memcached及MVC5测试分布式缓存入门
win10配置Memcached: 1.安装包下载 2.解压后有: 3.以管理员省份运行cmd: 4.安装:输入cmd命令: E:/memcached-amd64/memcached.exe -d ...
- [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter
Description The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Sea. The is ...
- hy 的惩罚
[问题描述] hy 抄题解又被老师抓住了,现在老师把他叫到了办公室. 老师要 hy 和他 玩一个游戏.如果 hy 输了,老师就要把他开除信息组: 游戏分为 k 轮.在游戏开始之前,老师会将 n 个由 ...
- [BZOJ]2194: 快速傅立叶之二
题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...
- Codeforces Round #438 C. Qualification Rounds
Description Snark and Philip are preparing the problemset for the upcoming pre-qualification round f ...
- 习题 7-2 uva225(回溯)
题意:从(0.0)点出发,第一次走一步……第k次走k步,且每次必须转90度,不能走重复的点.求k次后回到出发点的所有情况.按最小字典序从小到大输出. 思路: 把所有坐标+220,保证其是正数,然后搜索 ...
- [Noi2016]国王饮水记
来自FallDream的博客,未经允许,请勿转载,谢谢. 跳蚤国有 n 个城市,伟大的跳蚤国王居住在跳蚤国首都中,即 1 号城市中.跳蚤国最大的问题就是饮水问题,由于首都中居住的跳蚤实在太多,跳蚤国王 ...
- VS2012中C++,#include无法打开自己所写的头文件(.h)
最近刚开始学cocos2d-x,创建项目之后,自己按照<cocos2d-x 3.x 游戏开发>的教程写代码 先写了一个头文件 MyHelloWorldScene.h 然后在 AppDe ...
- C语言程序第二次作业
(一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...