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 之 瞬时状态 离线状态 持久化状态 三状态相关推荐

  1. Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

    1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model;import java.util.Date;pu ...

  2. Hibernate 系列 02 - Hibernate介绍及其环境搭建

    引导目录: Hibernate 系列教程 目录 昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归 ...

  3. 学习:配置hibernate

    最近实现的一系列功能(权限管理,索引持久化等)都涉及到了持久化问题 之前做了一个基于XML的管理插件,只需要在第一次读取的时候使用到XML,之后数据来自缓存,这样可以满足权限管理的功能,但是一旦权限发 ...

  4. Hibernate持久化对象三种状态

    持久化类类三种状态介绍 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录.它使用完成后,会被jvm直接回收掉, ...

  5. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  6. JavaWeb黑马旅游网-学习笔记02【注册功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  7. JavaWeb-综合案例(用户信息)-学习笔记02【登录功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  8. Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  9. Tomcat学习笔记02【Tomcat部署项目】

    Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...

最新文章

  1. 对于防止匿名评论/访问的操作
  2. 【NLP】如何清理文本数据
  3. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第四章——自编解析与答案
  4. 计算机科学与技术大学生职业规划,计算机科学与技术大学生职业生涯规划ppt
  5. 16个最有趣汉字,说透为人处世
  6. 19所大陆高校上榜!2021泰晤士世界大学影响力排名发布
  7. AifbdScore智能AI曲谱乐谱播放识别SDK midi曲谱 应用开发 五线谱 六线谱 四线谱播放
  8. vmware虚拟机桥接模式无法上网
  9. 这款手绘风格的在线制图软件超棒
  10. 基础练习 回文数 C语言
  11. google浏览器常用插件整理
  12. 【ES6】for of用法
  13. 如何破解域管理员密码
  14. druiddatasource 方法_DruidDataSource详解(一)
  15. 通过W3C验证CSS
  16. cesium天气(晴、雨、雪、雾)
  17. 二级路由dhcp关闭连不上wifi_如何解决家里Wifi能连接,但上不去网怎么办?
  18. 小米首页二级菜单栏实现原理
  19. phpstudy Error while setting value ‘STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
  20. 服务器连接数据库mysql

热门文章

  1. 多服务器session共享之memcache共享安装和实现篇(apache+php-windows)
  2. matlab 查看函数属性,matlab – 使用FFT属性查找2D函数的导数
  3. ios NSString 正则表达式 其它字符
  4. Android视图动画集合AndoridViewAnimations
  5. Swift2.0语言教程之下标脚本
  6. linux内存管理与设计,深入理解Linux内存管理机制(一)
  7. Matlab在ubuntu上运行速度,ubuntu环境下VLFeat在MATLAB上的运行
  8. python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作
  9. 8086汇编语言指令总结
  10. spring用xml还是java_Spring中如何混用XML与Java装配方式