Java对象在Hibernate持久化层的状态
-临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中。处于临时状态的java对象被称为临时对象。
-持久化状态:已经被持久化,并且加入到Session的缓存中。处于持久化状态的java对象被成为持久化对象。
-游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的java对象被成为游离对象。
//对象状态转换的过程
Transaction ts=session.beginTransaction();
User user =new User(); //临时状态
user.setName("tom");
user.setPassword("123456"); session.save(user); //转变为持久化状态
ts.commit(); //持久化状态 session.close(); //转变为游离状态
sessionfactory.close();
System.out.println(user.getName()); //游离状态
临时对象的特征:
-OID为null
-不处于Session的缓存中,也可以说,不被任何一个Session实例关联
-在数据库中没有对应的记录 持久化对象的特征:
-OID不为null
-位于一个Session实例的缓存中,持久化对象总是被一个Session实例关联
-持久化对象和数据库中的相关记录对应
-会根据持久化对象的属性变化,同步更新数据库。
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
user.setName("jerry");
transaction.commit();
我们发现我们没有执行update语句,却打印了update语句。Hibernate会自动将持久化对象的状态同步到数据库中。 游离对象的特征:
-OID不为null
-不再位于Session的缓存中,也可以说,游离对象不被Session关联
-数据库中有对应的记录
三种状态的转换
1)临时状态转换持久化状态
-Session的save()方法会将临时状态转换成持久状态。
把要保存的对象放入Session缓存中,使它进入持久化状态。使用映射文件指定的主键生成策略,为持久化对象分配唯一OID。
save方法只是为对象分配UID。我们可以在save方法处打断点。
当我们的主键生成策略为native时,由于我们使用mysql数据库,主键自增,所以执行完save方法后,打印insert语句,mysql数据库为我们对象自增OID
当我们的主键生成策略为incrementt时,increment是由Hibernate维护,先去表中查最大ID然后+1,我们执行完save方法之后,发现打印select查找最大id的语句,
执行commit时才打印插入语句 2)临时状态转换成游离状态
-将临时状态的对象OID设置为数据库中对应的记录.
User user=new User();
user.setId(1); 3)持久化状态转换成临时状态
第一种:
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
session.close(); //游离状态
user.setId(null);//临时状态
第二种:
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
user.setId(null);//临时状态 4)持久化状态转换成游离状态
第一:调用session的close方法,持久化状态变为游离状态
第二: 调用session的evict()方法方法,将持久状态转变为游离状态 5)游离状态转换成临时状态
只需要将游离状态的对象OID变为null。 6)游离状态转换成持久状态
Session的update()方法使游离状态转换成持久状态。
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
session.update(user);
Java对象在Hibernate持久化层的状态的更多相关文章
- java对象在hibernate持久层的状态
站在持久化层的角度,一个java对象在它的生命周期中,可处于以下4个状态之一: 临时状态(transient):刚刚用new语句创建,还没有被持久化,并且不处于Session的缓存中. 持久化状态(p ...
- [转]Java 对象锁-synchronized()与线程的状态与生命周期
线程的状态与生命周期 Java 对象锁-synchronized() ? 1 2 3 4 synchronized(someObject){ //对象锁 } 对象锁的使用说明: 1.对象锁的返 ...
- 《精通Hibernate:Java对象持久化技术详解》目录
图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- java框架篇---hibernate入门
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...
- Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征
以下情况java对象进入持久化状态: session.save()方法把临时对象转变为持久化对象. session.load()和session.get()方法得到的对象总是处于持久化状态. sess ...
- Hibernate持久化对象状态
在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- Hibernate中Java对象的三种状态
Hibernate中Java对象的三种 ...
随机推荐
- poj 1426 Find The Multiple (简单搜索dfs)
题目: Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal ...
- chromerdriver下载地址:xpath_help
chrome下载地址 http://npm.taobao.org/mirrors/chromedriver xpath_help https://blog.csdn.net/Cayny/article ...
- npm安装less和less-loadernpm或者stylus和stylus-loader
vue-cli 构建的项目默认是不支持 less 的,需要自己添加. 首选,安装 less 和 less-loader ,在项目目录下运行如下命令 npm install less less-load ...
- 剑指offer数组2
面试题39:数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次, ...
- RxPermissions Usage
refs:https://github.com/tbruyelle/RxPermissions https://www.jianshu.com/p/c3546e5cd2ffhttps://www.ji ...
- UOJ#314. 【NOI2017】整数 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ314.html 题解 如果只加不减,那么瞎势能分析一波可以知道暴力模拟的复杂度是对的. 但是有减法怎么办? ...
- 【Java】 剑指offer(30) 包含min函数的栈
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min ...
- es elasticsearch-head安装
---恢复内容开始--- 参考 https://www.jianshu.com/p/36d7f97a20cd 1.下载安装git clone git://github.com/mobz/elastic ...
- Imcash科普:没有网络也可以转账比特币?你可能有些误解
近日,据Bitcoinist消息,比特币解决方案开发商CoinKite联合创始人Rodolfo Novak和OpenBazaar联合创始人Sam Patterson在推特上宣布,两人不借助互联网和卫星 ...
- Linux下Apache配置HTTPS功能
Apache配置HTTPS功能 转 https://www.cnblogs.com/liaojiafa/p/6028816.html 一.yum 安装openssl和openssl-devel,ht ...