Rhythmk 学习 Hibernate 02 - Hibernate 之 瞬时状态 离线状态 持久化状态 三状态
by:rhythmk.cnblogs.com
1、Hibernate 三种状态:
1.1、三种定义(个人理解,不一定准确):
瞬时状态(transient): 不被session接管,且不存在数据库中的对象的状态,类似于新New一个对象
离线状态 (detached): 数据库中存在而不被session接管
持久化状态(persistent): 对象被session管理且数据库中存在此对象
1.2、 状态之间转换关系图
2 、状态转换以及Hibernate数据库执行过程详解:
2.1 瞬时状态 转换为 持久化对象
/* * 瞬时状态转换成序列化状态* */Session session = null;try {session = HibernateUtil.getSessionFactory().openSession();session.beginTransaction();User user=new User();user.setCreateTime(new Date());user.setName("rhythmk");user.setOpenId(10);user.setType("admin");// 此时User为瞬时对象session.save(user);// 通过save方法 user已经转变为持久化对象session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}}
当一个 瞬时对象被转成持久化对象后 ,只要此session会话没有关闭,该对象属性值再发生变化,session提交时候都会去对比该对象于保存时候是否被修改过。
如果被修改,则将该对象最终结果同步到数据库。
参考代码如下,进过在转变为持久化对象后进过多次调用update方法,最终生成的SQL语句依然只会有一个Insert与一条Update:
@Testpublic void test2(){Session session = null;try {session = HibernateUtil.getSessionFactory().openSession();session.beginTransaction();User user=new User();user.setCreateTime(new Date());user.setName("rhythmk");user.setOpenId(10);user.setType("admin");// 此时User为瞬时对象session.save(user);// 通过save方法 user已经转变为持久化对象user.setName("updatename");session.update(user);user.setName("updatename2");session.update(user);user.setName("updatename3");session.update(user);session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}}
输出:
Hibernate: insert into user (openId, type, name, createTime) values (?, ?, ?, ?)
Hibernate: update user set openId=?, type=?, name=?, createTime=? where userId=?
2.2 、当一个离线对象 通过session.delete方法转换成瞬时对象,此时瞬时对象的值发生变化将不生成同步SQL
@Testpublic void test3() {Session session = null;try {session = HibernateUtil.getSessionFactory().openSession();session.beginTransaction();User user = new User();user.setCreateTime(new Date());user.setName("rhythmk");user.setOpenId(10);user.setType("admin");user.setUserId(12);session.delete(user);
//此时 user成为瞬时状态 以后其属性值的改变不会再生成SQL语句user.setName("updatename");user.setName("updatename3");session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}}
输出:
Hibernate: delete from user where userId=?
当一个离线状态转换成瞬时状态时,改对象属性值发生变化尽管设定了改对象主键值,再调用session.save方法生成的Insert语句将不关注此主键ID
@Testpublic void test4() {Session session = null;try {session = HibernateUtil.getSessionFactory().openSession();session.beginTransaction();User user = new User();user.setCreateTime(new Date());user.setName("rhythmk");user.setOpenId(9);user.setType("admin");user.setUserId(9);session.delete(user);user.setName("updatename");session.save(user);user.setName("updatename3");session.update(user);user.setName("updatename32");session.update(user);user.setName("updatename33");session.update(user);session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}}
输出:
Hibernate: delete from user where userId=?
Hibernate: insert into user (openId, type, name, createTime) values (?, ?, ?, ?)
Hibernate: update user set openId=?, type=?, name=?, createTime=? where userId=?
参考方法:
session.saveOrupdate(object)
根据object对象的主键ID判断如果,数据库存在记录则更新,否则添加
session.merge(object)
如果session回话中已经存在某主键ID的对象,如果此时再添加一个同主键的新对象进如回话状态,将出现异常 ,
此情况则可以调用merge方法对session回话中以存在对象进行覆盖:
如:
session = HibernateUtil.openSession();session.beginTransaction();//u1已经是持久化状态User u1 = (User)session.load(User.class, 3);System.out.println(u1.getUsername());//u2是离线状态User u2 = new User();u2.setId(3);u2.setPassword("123456789");//此时u2将会变成持久化状态,在session的缓存中就存在了两份同样的对象,在session中不能存在两份拷贝,否则会抛出异常
// session.saveOrUpdate(u2);//merge方法会判断session中是否已经存在同一个对象,如果存在就将两个对象合并session.merge(u2);//最佳实践:merge一般不用session.getTransaction().commit();
参考:
http://www.cnblogs.com/xiaoluo501395377/p/3380270.html
Rhythmk 学习 Hibernate 02 - Hibernate 之 瞬时状态 离线状态 持久化状态 三状态相关推荐
- Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]
1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model;import java.util.Date;pu ...
- Hibernate 系列 02 - Hibernate介绍及其环境搭建
引导目录: Hibernate 系列教程 目录 昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归 ...
- 学习:配置hibernate
最近实现的一系列功能(权限管理,索引持久化等)都涉及到了持久化问题 之前做了一个基于XML的管理插件,只需要在第一次读取的时候使用到XML,之后数据来自缓存,这样可以满足权限管理的功能,但是一旦权限发 ...
- Hibernate持久化对象三种状态
持久化类类三种状态介绍 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录.它使用完成后,会被jvm直接回收掉, ...
- MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02
MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...
- JavaWeb黑马旅游网-学习笔记02【注册功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb-综合案例(用户信息)-学习笔记02【登录功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...
- Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】
Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...
- Tomcat学习笔记02【Tomcat部署项目】
Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...
最新文章
- 对于防止匿名评论/访问的操作
- 【NLP】如何清理文本数据
- 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第四章——自编解析与答案
- 计算机科学与技术大学生职业规划,计算机科学与技术大学生职业生涯规划ppt
- 16个最有趣汉字,说透为人处世
- 19所大陆高校上榜!2021泰晤士世界大学影响力排名发布
- AifbdScore智能AI曲谱乐谱播放识别SDK midi曲谱 应用开发 五线谱 六线谱 四线谱播放
- vmware虚拟机桥接模式无法上网
- 这款手绘风格的在线制图软件超棒
- 基础练习 回文数 C语言
- google浏览器常用插件整理
- 【ES6】for of用法
- 如何破解域管理员密码
- druiddatasource 方法_DruidDataSource详解(一)
- 通过W3C验证CSS
- cesium天气(晴、雨、雪、雾)
- 二级路由dhcp关闭连不上wifi_如何解决家里Wifi能连接,但上不去网怎么办?
- 小米首页二级菜单栏实现原理
- phpstudy Error while setting value ‘STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
- 服务器连接数据库mysql
热门文章
- 多服务器session共享之memcache共享安装和实现篇(apache+php-windows)
- matlab 查看函数属性,matlab – 使用FFT属性查找2D函数的导数
- ios NSString 正则表达式 其它字符
- Android视图动画集合AndoridViewAnimations
- Swift2.0语言教程之下标脚本
- linux内存管理与设计,深入理解Linux内存管理机制(一)
- Matlab在ubuntu上运行速度,ubuntu环境下VLFeat在MATLAB上的运行
- python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作
- 8086汇编语言指令总结
- spring用xml还是java_Spring中如何混用XML与Java装配方式