Hibernate对象就是java中的实体对象,管理就是在实体对象的生命周期内被Hibernate的操作,Hibernate对象的生命周期其实就是实体对象的生命周期(从创建到最后被GC回收),期间对实体对象的操作就是Hibernate对象生命周期管理。具体是使用Hibernate的API,对Hibernate的对象进行状态的切换,一般在临时状态,持久状态和游离状态三个之间进行。下面简单的记录下三种状态的特点以及如何使用API对其进行切换。

Hibernate对象的三种状态

(1)临时状态:内存中有对象,DB中没有数据,修改内存中的数据对DB中的没有影响

(2)持久状态:内存中有对象,DB中也有数据,通过操作内存中的对象可以修改DB中的数据

(3)游离状态:内存中有对象,DB中也有数据,对象与数据断开连接,修改对象不会影响DB中的数据

Hibernate对象状态的切换

Hibernate对象的三种状态可以实现切换,具体参考下图,选择合适的API,就能实现状态的变化。另外使用session的get方法得到的对象,这个对象就是持久状态,对其操作会影响DB中的数据。下图中从持久状态切换到游离状态有clear方法和evict方法,前者是将session中的所有对象进行清除,后者是只清除一个对象。

Hibernate对象状态切换测试

下面将通过以下几个测试来观察对不同状态Hibernate对象的操作,DB中数据的变化。

(1)对持久状态对象的操作

使用session对象get到student对象后,将名字修改为'new name',再查看DB中是否有变化。

测试代码:

      //测试Hibernate对象管理,对持久状态的对象操作将影响数据库结果
      @Testpublic void testUpdate() {Session session=getSession();//开始事务Transaction trans=session.beginTransaction();trans.begin();//使用get方法获取持久状态的对象Student stu=(Student) session.get(Student.class, 4);System.out.println(stu);//修改对象的名字stu.setName("new name");System.out.println(stu);//提交事务
          trans.commit();//关闭session
          session.close();}

测试前DB中情况:

测试后DB中的情况:

可以看出,对获取的对象操作,将直接影响DB中数据的结果,并且直接setName后,再次输出stu后name已更新为'new name'。

(2)测试从持久状态变成临时状态

从持久状态变成临时状态可以使用session的delete方法,获取刚才修改了名字的stu后,再将其delete,测试DB中的情况。

测试代码:

      //测试从持久状态变到临时状态
      @Testpublic void testDelete() {Session session=getSession();//开始事务Transaction trans=session.beginTransaction();trans.begin();//使用get方法获取持久状态的对象Student stu=(Student) session.get(Student.class, 4);System.out.println(stu);//使用delete方法删除
          session.delete(stu);System.out.println(stu);//提交事务
          trans.commit();//关闭session
          session.close();}

测试前DB情况:

测试后DB情况:

测试发现使用delete方法后,数据库中没有了id为4,name为'new name'的这条记录,但是依然可以使用print方法打印出这个对象,说明对象依然存在内存中,DB中却没有了数据。

(3)测试从持久状态变成游离状态

从持久状态变成游离状态,使用evict方法,从当前session中清除出来,如果使用clear方法就是清除所有session中的对象。

测试代码:

      //测试从持久状态变成游离状态,使用evict方法,从当前session中清除出来,如果使用clear方法就是清除所有session中的对象
      @Testpublic void testEvict() {Session session=getSession();//开始事务Transaction trans=session.beginTransaction();trans.begin();//使用get方法获取持久状态的对象Student stu=(Student) session.get(Student.class, 5);System.out.println(stu);        //将对象从session中清除
          session.evict(stu);//对对象进行操作,修改名字,看看是否对数据库数据有影响stu.setName("new name");System.out.println(stu);//提交事务
          trans.commit();//关闭session
          session.close();}

测试前DB情况:

测试后DB情况:

测试发现当Hibernate对象变成游离状态后,对实体对象的操作不会影响DB中的数据。

(4)测试从游离状态回到持久状态

从游离状态回到持久状态,可以调用session的update方法,将上面id为5,name为'clyang'的对象名字修改为'new name'。但是在修改之前先将对象切换为游离状态,使用session的evict方法。

测试代码:

      //测试从游离状态回到持久状态,可以调用update方法
      @Testpublic void testObjUpdate() {Session session=getSession();//开始事务Transaction trans=session.beginTransaction();trans.begin();//使用get方法获取持久状态的对象Student stu=(Student) session.get(Student.class, 5);System.out.println(stu);        //将对象变成游离状态然后再后续操作
          session.evict(stu);//对对象进行操作,修改名字,看看是否对数据库数据有影响stu.setName("new name");//使用session的update方法
          session.update(stu);System.out.println(stu);//提交事务
          trans.commit();//关闭session
          session.close();}

测试前DB情况:

测试后DB情况:

可以看出,当游离状态的stu对象更新name属性为'new name'后,再执行session的update方法,则DB中数据也发生了变化,说明将stu对象从游离状态又变回到了持久状态。

结论

Hibernate对象的生命周期就是Java实体对象的生命周期,对其生命周期的管理,是通过切换不同的状态来实现的,具体的三种状态分别为临时状态、持久状态和游离状态。

转载于:https://www.cnblogs.com/youngchaolin/p/10901988.html

SSH学习-Hibernate对象生命周期管理相关推荐

  1. 容器,对象生命周期管理的基石

    2019独角兽企业重金招聘Python工程师标准>>> 郑重申明:包括本文在内的很多技术文章,大多出自山外高人,而非Fans. Fans暂时没有能力写作优秀的技术文章,Fans只是转 ...

  2. 自定义Unity对象生命周期管理集成ADO.NET Entity Framework

    在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们 ...

  3. MinIO对象生命周期管理解析

    目录 前言 对象过期 远程存储层(Tiers)常用分层场景 跨存储介质 跨云类型 公有云 文件迁移实例 Tiers配置 生成周期管理配置 原始桶的tiertest前缀的文件目录 远程存储层目录结构 原 ...

  4. Linux多线程服务端编程笔记,陈硕Linux多线程服务端编程读书笔记 —— 第一章 线程安全的对象生命周期管理...

    muduo书第一章的思维导图(新窗口打开可以看大图) 线程安全的对象析构和回调(使用shared_ptr和weak_ptr) 注释是英文的(工地英语-) StockFactory.h // in mu ...

  5. npm scripts的生命周期管理

    2019独角兽企业重金招聘Python工程师标准>>> 我们平时阅读一些开源项目,可能会发现有些项目的package.json里的scripts区域定义的脚本很复杂,令人眼花缭乱. ...

  6. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行 ...

  7. Hibernate持久化对象生命周期之实战探索

    正所谓"工欲善其事,必先利其器",我陈述过自己的从业经历,因为并非IT科班出身,刚入职有很多不懂,由于需要快速开发,所以在还未对Hibernate有仔细的认识前,我就兼任新老系统的 ...

  8. Python学习手册之内部方法、操作符重载和对象生命周期

    在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...

  9. Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;

    说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...

最新文章

  1. Linux学习笔记5月22日任务
  2. Vue导入非模块化的第三方插件功能无效解决方案
  3. 数据仓库与联机分析处理技术
  4. day8-异常处理与网络编程
  5. 中国电信陆良军:2020年5G手机终端规模达1.7亿
  6. (转载)SQL基础-- 约束(CONSTRAINT)
  7. 深入理解 Java 内存模型
  8. ESXI5.5设置主机的时间自动同步服务 NTP
  9. 监控mysql连接池信息_druid-带监控功能的数据库连接池
  10. git idea提交代码的步骤
  11. OriginPro 中文
  12. 浅谈文字编码和Unicode(上)
  13. vue Root file specified for compilation
  14. hashCode() vs equals() vs ==
  15. 计算机硬件系统外设是指,计算机硬件系统.
  16. 卧槽!我的世界也有开源版本了!!!
  17. loadIdealTree:loadAllDepsIntoIdealTree: sill install loadIdealTree
  18. 稀疏一元多项式(C++)
  19. 电脑蓝屏(你的电脑遇到问题,需要重新启动)
  20. python编程软件排行榜_python编程软件

热门文章

  1. mysql 多表查询 优化_Mysql 多表联合查询效率分析及优化
  2. mysql本地连接报错1130_mySql连接问题(本地连接加远程连接)
  3. zynqpl端时钟_第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
  4. linux 段大小,linux - 在套接字上的Linux中减少TCP最大段大小(MSS) - 堆栈内存溢出...
  5. mysql blob 导出_mysql blob导出文本解密 | 学步园
  6. mybatis 默认参数名#{0}、#{arg0}、#{param1},以及@Param
  7. linux 内核 4.10.0,Bodhi Linux 4.2.0发布下载,运行Linux内核4.10
  8. pip更新失败_最全Tensorflow2.0 入门教程持续更新
  9. c语言哈夫曼压缩文本,用哈夫曼压缩文件(C语言)
  10. android 观察者,Android开发实现简单的观察者与被观察者示例