Hibernate之对象的三种状态
Hibernate之Java对象的三种状态
一.简述
本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/article/details/6436517。在此表示歉意和深深的谢意。如若各位读者在阅读的过程中发现有任何的纰漏或者错误,请及时之处,本人不胜感激,
Hibernate中对象有三种状态: 临时状态(Transient)、持久状态(Persistent)、游离状态(Detached)。
临时状态:刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的状态的Java对象被称为临时对象。
持久化状态:已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
游离状态:已经被持久化,但不处于session的缓存中。处于游离状态的Java对象被称为游离对象。
二. 具体的描述
2.1 代码描述
@Test
public void status(){
//开启事务
Transaction tx = session.beginTransaction(); //此时customer处于临时状态,此时customer没有持有oid
Customer customer = new Customer();
customer.setName("NNNNNN");
customer.setPhoneNum("223344"); //此时对象持有了oid,与数据库建立的关联关系
int id = (Integer)session.save(customer); //当使用load()或者get()方法的时候,不会发送任何的sql语句,而是直接从session缓存中获取。
Customer customer1 = session.get(Customer.class, id); //结果为true,也就是说拿到的其实是同一个对象
System.out.println(customer == customer1); customer.setName("YYYYYY");
customer1.setName("BBBBBB"); System.out.println(customer1.getName()); System.out.println("customer的Id为:" + customer.getId()); //当事务提交时,实际会发送两条SQL:一条插入,一条更新
tx.commit();
//当session关闭后,customer处于游离状态
session.close(); System.out.println("当customer变为游离状态,依然持有oid: " + customer.getId()); Session session2 = OracleSessionUtils.openSession();
Transaction tx1 = session2.beginTransaction();
//此时customer被重新纳入到session的缓存中, 由游离状态变为持久化状态
session2.update(customer);
customer.setName("MMMMMM");
customer.setName("OOOOOO");
//事务再次提交,实际只会发送一条SQL
tx1.commit();
//customer在此从持久状态变为游离状态
session2.close();
}
2.2 图片描述
注:本图片也是摘自FG2006这为大神的博文。

2.3 对象状态转换的相关方法描述
get、load、find: 方法的使用上较为类似,get和find方法笔者暂时未发现任何的不同之处。他们都是将数据库中对应Id的数据映射为Java对象,此时对象变为持久化状态。
save: 保存,此时Java对象已经与数据库记录建立的关系。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。
saveOrUpdate: 保存或者更新,如果没有与数据库记录所对应的oid,则执行保存,如果有,则执行更新。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。
delete: 删除对象,将对象从持久化状态或者游离状态变为临时状态。
close: 关闭session, 先将session清空,然后再关闭。将对象从持久状态变为临时状态。
clear: 清空session缓存。将对象从持久状态变为临时状态。
evict: 清除指定的对象。将对象从持久状态变为临时状态。
Hibernate之对象的三种状态的更多相关文章
- Hibernate持久化对象的三种状态深入理解
		
关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...
 - 【SSH系列】-- Hibernate持久化对象的三种状态
		
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
 - Hibernate中对象的三种状态及相互转化
		
1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下: Customer customer=new Customer(“ ...
 - JavaWeb_(Hibernate框架)Hibernate中对象的三种状态
		
对象的三种状态 瞬时状态: 实体 没有id.没有与session关联 持久化状态: 特点:持久化状态对象的任何改变都会同步到数据库中 游离态[也称作托管态]: 实体 有id,没有与session关联 ...
 - Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
		
首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...
 - hibernate 实体对象的三种状态以及转换关系。
		
最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...
 - Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】
		
当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...
 - hibernate实体对象的三种状态:自由状态,持久状态,游离状态.
		
自由态与游离态的区别: 当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它 对应的记录,只是现在这个游离对 ...
 - hibernate操纵数据库常用方法 及 hibernate对象的三种状态
		
在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...
 
随机推荐
- 以策略为导向的VI设计
			
从美学角度评价一个标志(LOGO)不是最佳方法,标志设计不是为了参加选美.标识要求除了审美功能外还应包括很多元素. 要说标志,先从CIS(企业形象系统)开始入手,里面分成MI.VI和BI,分别指企业的 ...
 - PHP生成二维码图片
			
下载二维码文件:http://files.cnblogs.com/isboy/qr_code.zip 需要加入的HTML:<img id="js_pc_qr_code_img" ...
 - 项目用到的icarouls类和UIEffectDesignerView类,菜单技巧,构思(金方圆)
			
// // MenuHomeViewController.m // HFYS // // Created by Showsoft_002 on 13-8-14. // Copyright (c ...
 - Linux 和 Windows 常用工具列表
			
1. Windows 篇 1)MobaItem 一款优秀的Windows下模拟Linux Terminal工具,同时也可以用来远程Linux服务器. 2. Linux 篇 2) MC Linux下非常 ...
 - 国内如何使用gem?
			
答案很简单,使用淘宝镜像! https://ruby.taobao.org/ 造福人类啊! 设置方法: $ gem sources --add https://ruby.taobao.org/ --r ...
 - (实用篇)浅谈PHP拦截器之__set()与__get()的理解与使用方法
			
"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和&q ...
 - .gitignore失效问题解决
			
.gitignore失效背景: 本地Mac上使用Unity新建了一个项目,使用git init将项目初始化为仓库,此时commit.随后,加入.gitignore文件,再次commit.然后提交整个仓 ...
 - java问题排查可能用到的一些命令
			
1. jmap查询jvm内存使用情况 -heap :打印jvm heap的情况 -histo: 打印jvm heap的直方图.其输出信息包括类名,对象数量,对象占用大小. -histo:live : ...
 - 通过sougou输入法,解决卡在Setup Wizard(小绿人)界面
			
本人使用海信EG900手机(安卓2.3.5,已root),为了使用google的服务,先后手动复制和CWM recovery刷入google服务包(gapps-gb-20110828-signed.z ...
 - 【我是老中医】VMware在win8.1下开Ubuntu提示”内部错误"解决方案
			
这个题目起得很洋气啊,其实问题也比较好解决,但是我想多码几个字!!! 友情提示:如果不想看废话,请直接看最后的红字! 好的,咱们从头说(废话)起.话说我们学院每年都会组织大三的进行校企联合实训(其实就 ...