文档章节

Hibernate的三种状态及对象生命周期

小致dad
 小致dad
发布于 2017/07/23 17:06
字数 818
阅读 28
收藏 0
点赞 0
评论 0

 理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助。

三种状态

临时状态(Transient):在通过new关键字,实例化一个对象开始,该对象就进入了临时状态,但它还没有被持久化,没有保存在Session当中。

持久化状态(Persistent):对象被加入到Session缓存当中,如通过session.save(entity),Hibernate把实体保存到seesion当中,entity就处在持久化状态中。

游离状态(Detached):对象脱离了session缓存,如通过session清理,将对象保存到数据库中,原来在session中的对象仍然与内存中,该对象就处于游离状态。

 

临时状态

(Transient)

持久化状态

(Persistent)

游离状态

(Detached)

是否存于Session缓存中 × ×
数据库中是否有对应记录 ×

三种状态之间的转换

1)瞬时对象(Transient)

    1.1)new 创建 (无->Transient)

    1.2)delete--(Persistent->Transient) session.delete(o)

2)持久对象(Persistent)

    1.1)save/saveOrUpdate.(Transient->Persistent)

   1.2)get/load/find,iterator.(无->Persistent)

           get--get(User.class,id),通过类名和id从数据库读取指定记录,无匹配记录返回null。

          load--通过类名和id从数据库读取指定记录,无匹配记录抛OjectNotException异常。

          find,iterator---hibernate3已废除,统一Query接口提供。

    1.3)update/saveOrUpdate/lock.(Detached->Persistent)

          lock--把对象和session关联起来,lock之前的修改不会更新到数据库。

          update--把对象和session关联起来,并且会把修改更新到数据库。

          saveOrUpdate--把对象和session关联起来,并且会把修改更新到数据库。

3)游离状态(Detached)

          evict--把某个对象从session中移除(Persistent->Detached)

          clear--把所有对象从session中移除

          close--关闭session,其中的对象也全部被移除了。

对象生命周期

下面以一个对象从生成到保存到数据库的流程做一下解析:

    当一个对象被实例化出来以后,该对象是临时状态,当调用方法session.save(entity),后该对象被加入到session缓存中,进入持久化状态,这时数据库中还不存在相关的记录,当session提交数据库事务时,这里隐含做了两件事,一件事是隐式调用session.flush(),其作用先是清理缓存(相当于调用了session.clear()),再生成一条对应的insert语句,但该语句还没有提交,第二件事是对刚才生成的语句进行提交,从而在数据库中生成了对应的记录。至此原entity对象就在数据库中生成了一条对应的记录,而它本身也脱离了session缓存,处于游离状态,该对象经过垃圾回收机制处理被回收。一个hibernate的保存对象过程就此结束。

实例代码如下:

Session session = null;
try {
	session = HibernateUtil.openSession();
	//开始事务
	session.beginTransaction();
	//member对象进入临时状态
	Member member = new Member();
	member.setMobile("18208195215");
	member.setUsername("liping");
	//member对象进入持久化状态
	session.save(member);
	//提交事务,隐式包含了session.flush()的动作
	session.getTransaction().commit();
	//提交完成后,member处于游离状态
} catch (HibernateException e) {
	e.printStackTrace();
	if (session != null)
	session.getTransaction().rollback();
} finally {
	if (session != null)
	session.close();
}

 

© 著作权归作者所有

共有 人打赏支持
小致dad
粉丝 116
博文 510
码字总数 556749
作品 0
济南
技术主管
简单理解Hibernate三种状态的概念及互相转化

本文描述了Hibernate三种状态的概念及互相转化。Java对象的生命周期中有三种状态,而且互相转化。它们分别是临时状态,持久化状态,以及游离状态。 AD:51CTO学院:IT精品课程在线看! 在Hib...

xiaml
2014/03/30
0
0
新手上路之Hibernate(三):持久化对象三种状态以及session的Get()与Load()区别

一、Hibernate持久化对象三种状态 在hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。 1. 瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a)...

Airship
2016/12/12
1
0
Hibernate杂问

1 谈谈你对ORM框架的基本思想的了解? 首先 ORM是 对象关系映射,是为了解决类似于JDBC实现对象持久化的问题开发的。 框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射。 他的...

陈嘻嘻哈哈
2015/12/18
0
0
Hibernate之saveOrUpdate

一个PO有三种状态: 1、未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2、已被持久化的PO,并且在Session生命周期内 此时映射数据库数据,由数据库管理生命周期 3、曾被持久化过...

大黄有故事
2016/10/23
0
0
Java程序员从笨鸟到菜鸟之(六十二)细谈Hibernate(十三)session缓存机制和三种对象状态

Hibernate向我们提供的主要的操纵数据库的接口,Session就是其中的一个,它提供了基本的增,删,改,查方法.而且具有一个缓存机制,能够按照某个时间点,按照缓存中的持久化对象属性的变化来更新数据...

长平狐
2012/11/12
96
0
Hibernate对象

Hibernate对象 Hibernate是java (对象关系映射)ORM管理框架; Hibernate对象就是O--java实体;Hibernate通过对实体的管理在不同状态之间的转换来实现关系数据库的映射; Hibernate对象状态...

天呀鲁哇
2015/09/10
101
0
关于hibernate,spring,lucene的几道题,答对几道算是对他们有基本了解了?

1, hibernate有哪三种检索方式?适用于那种场合? 2,持久化的三种状态及相互的转换? 3,映射继承的方式? 4,hibernate.cfg.xml中配置的方言是用来干什么的? 5,请阐述Session的作用和特...

军区文工团
2012/06/09
634
2
Java面试题之Hibernate

1.简书一下Hibernated的开发流程 第一步:加载Hibernate的配置文件,读取配置文件的参数, 第二步:创建SessionFactory会话工厂(内部有连接池) 第三步:打开Session 连接 第四步:开启事务...

年轻诠释我们的梦想_705b
06/05
0
0
hibernate 缓存机制

缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache。缓存目的:让数据更接近于应用程序,协调速度不匹配...

世界和平维护者
2016/08/09
33
0
谈谈hibernate的三种状态

下面大部分内容都是看书看到的,摘录下来。 hibernate的三种状态: transient objects: 瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系 1、使用new操作符初始...

tiger1986
2013/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

pbgo: 基于Protobuf的迷你RPC/REST框架

https://www.oschina.net/p/pbgo

chai2010
34分钟前
0
0
rsync工具介绍、常用选项以及通过ssh同步

linux下的文件同步工具 rsync rsync是非常实用的一个同步工具,可以从a机器到b机器传输一个文件,也可以备份数据,系统默认没有这个工具,要使用命令 yum install -y rsync 安装。 rsync的命...

黄昏残影
50分钟前
0
0
OSChina 周四乱弹 —— 表妹要嫁人 舅妈叮嘱……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @哈哈哈哈哈嗝:一定要听——The Pancakes的单曲《咁咁咁》 《咁咁咁》- The Pancakes 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :...

小小编辑
今天
245
4
流利阅读笔记30-20180719待学习

重磅:让人类得老年痴呆的竟是它? Lala 2018-07-19 1.今日导读 去年奥斯卡最佳动画长片《寻梦环游记》里有一句经典台词:“比死亡更可怕的,是遗忘”。在电影中,年迈的曾祖母会重复说一样的...

aibinxiao
今天
3
0
1.16 Linux机器相互登录

Linux机器之间以密码方式互相登录 运行命令#ssh [ip address],标准命令:#ssh [username]@ip, 如果没有写用户名,则默认为系统当前登录的用户 命令#w查看系统负载,可查看到连接到该主机的...

小丑鱼00
今天
0
0
about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部