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对象的三种 ...
随机推荐
- 【原创】运维基础之Redis(1)简介、安装、使用
redis 5.0.3 官方:https://redis.io/ 一 简介 Redis is an open source (BSD licensed), in-memory data structu ...
- ApowerMirror投屏(手机投屏电脑、电脑投屏到手机)
使用步骤 1. 亲测 使用Apowersoft ApowerMirror v1.4.2.zip版本 2.Apowersoft ApowerMirror v1.4.2.zip 解压安装 ...
- jsp 异步处理
一. 概述 异步处理功能可以节约容器线程.你应该将此功能 使用在长时间运行的操作上.此功能的作用是释放正在 等待完成的线程,使该线程能够被另一请求所使用. 二. 编写异步Servlet和过滤器 We ...
- SQL入门(3):定义约束/断言assertion/触发器trigger
本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...
- python TextMining
01.Crawling url_request # -*- coding: utf-8 -*- """ Created on Sun Feb 17 11:08:44 20 ...
- 项目sql统计
- P1169 [ZJOI2007]棋盘制作 DP悬线法
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...
- Ubuntu16.04下Hadoop的本地安装与配置
一.系统环境 os : Ubuntu 16.04 LTS 64bit jdk : 1.8.0_161 hadoop : 2.6.4 部署时使用的用户名为hadoop,下文中需要使用用户名的地方请更改为 ...
- 理解Python协程:从yield/send到yield from再到async/await
Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...
- 一个div实现白眼效果
巧妙利用border和background-clip <div class="eye"></div> .eye{ width:150px; height ...