hibernate5(7)操纵对象入门[2]四大对象状态分析

状态类型

在hibernate中,java对象的声明周期对应有4种状态:

状态 说明
瞬时(Transient) new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会(在清理Session时)被持久化到数据库中,也不会被赋予持久化标识(identifier)。使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)
持久(Persistent) 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在清理Session时将对象数据(state)与数据库同步(synchronize)。我们不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句,也会将数据库中相应对象删除。
脱管(Detached),也叫游离 与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。这在现实开发场景中颇有意义,如果我们某个对象属性要等待用户输入修改,可以先关闭session,释放数据库资源,在获取到用户修改信息后,再将此对象关联到新的Session中更新数据库
删除(removed) Session将要对象从数据库中删除,但此时在程序中改对象仍存在,变为removed状态,如对使用级联删除User,则其对应Article对象也会被删除

下列这张图片展示了在hibernate操作中对象状态的转换关系

状态特征

下面是这4种状态的相应特征

对象状态 状态特征
临时对象(Transient) 在使用代理主键的情况下,OID 通常为 null
2. 不处于 Session 的缓存中
3. 在数据库中没有对应的记录
持久化对象(也叫”托管”)(Persist) OID 不为 null
2. 位于 Session 缓存中
3. 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
4. Session 在 flush 缓存时,会根据持久化对象的属性变化,来同步更新数据库
5. 在同一个 Session 实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象
删除对象(Removed) 在数据库中没有和其 OID 对应的记录
2. 不再处于 Session 缓存中
3. 一般情况下,应用程序不该再使用被删除的对象
游离对象(也叫”脱管”) (Detached) OID 不为 null
2. 不再处于 Session 缓存中
3. 一般情况需下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

在下一篇文章里,我们会介绍如何通过Session接口操纵各种对象状态,通过零SQL语句,完成相应的数据库增删改查操作。

时间: 2024-08-08 00:12:21

hibernate5(7)操纵对象入门[2]四大对象状态分析的相关文章

hibernate5(8)操纵对象入门[3]操控对象封装方法

为什么要说是"封装方法"呢?因为它帮我们封装好了底层的增删改查操作,直接调用相应方法即可灵活地操作我们数据库数据.它们由Session接口提供,下面我们通过实例一一分析这些方法. 1.save方法 Session 的 save() 方法使一个临时对象转变为持久化对象 Session 的 save() 方法完成以下操作: 1. 把 User对象加入到 Session 缓存中,使它进入持久化状态 2. 选用映射文件指定的标识符生成器,为持久化对象分配唯一的 OID.在 使用代理主键的情况下

hibernate5(6)操纵对象入门[1]Session缓存

java对象在JVM中的存活条件 在java中,我们使用User user = new User();来创建一个java对象时,JVM会为其分配一块内存空间,此时,这个对象被变量"user"引用,那么它就会一直存在于内存中,而如果我们我们的"引用者user"升级了,User user = new VipUser().那么原来new User()不再被任何变量引用,它就会结束自己的生命周期,然后会被JVM的智能垃圾回收期回收处理,以免再占用内存. 从以上分析,我们知道

ASP入门教程-Request对象概述

Request对象在HTTP请求期间检索客户端浏览器传递给服务器的值.也就是说用它来与客户端交互,收集客户端信息或服务器端的环境变量,然后将收集的这些信息发送给服务器端或其它asp页面. 一.Request 对象的集合 Request对象共有5个集合,如下表: 集合名称 说 明 ClientCertificate 当客户端访问一个页面或其它资源时,用来向服务器表明身份的客户证书的所有字段或条目的数值集合,每个成员均是只读.(用于检索存储在发送到HTTP请求中客户端证书中的字段值) Cookies

ASP入门教程-Server对象概述与属性

一.Server对象概述 通过Server对象可以使用服务器上的许多高级功能.使用Server对象可以创建各种服务器组件实例,从而实现访问数据库对文件进行输入输出,以及在Web页上自动轮换显示广告图像等功能:使用Server功能也可以完成调用ASP脚本.处理HTML和URL编码以及获取服务器对象的路径信息等任务.Server对象通过属性和方法来访问Web服务器,从而实现对数据.网页.外部对象.组件的管理. 二.Server对象的 属性 Server对象只支持一个ScriptTimeout属性,用

javascript入门之window对象【新手必看】_javascript技巧

window :window对象是BOM中所有对象的核心,除了是BOM中所有对象的父对象外,还包含一些窗口控制函数. 1.全局的window对象 JavaScript中的任何一个全局函数或变量都是window的属性. <script type="text/javascript"> var name="撼地神牛"; document.write(window.name); </script> 2.window与self对象 self对象与win

JS搞基指南----延迟对象入门提高资料整理

原文:JS搞基指南----延迟对象入门提高资料整理 JavaScript的Deferred是比较高大上的东西,  主要的应用还是主ajax的应用,  因为JS和nodeJS这几年的普及,  前端的代码越来越多,  各种回调套回调再套回调实在太让人崩溃, 所以就从后端拖了一个延迟对象这货, 用来解决回调地狱这个问题 .  我们使用ajax的时候多数都是为ajax添加回调 ,然后异步向服务器发送请求, 比如如下原生的XHR代码: <!DOCTYPE html PUBLIC "-//W3C//D

ASP.NET数据访问 - 四大对象

今天总结下ASP.NET中的基本数据访问.写过ASP数据库编程的朋友应该知道,在ASP中访问数据库主要用到三大对象:Connection, Command, RecordSet 新一代的ADO.NET对老的ADO进行了升级,主要有四大对象:1)SqlConnection2)SqlCommand3)SqlDataAdapter4)DataSet 其中,SqlDataAdapter是新增加的适配器对象.它用来填充结果集. 1)建立并打开连接2)根据连接和sql语句创建适配器3)用适配器填充结果集4)

初学Java入门--类与对象

初学|对象 4.2 类与对象 4.2.1 类 在面向对象的语言中,类是个很重要的概念.面向对象的方法把所有的处理对象进行归类.具有相同性质的对象归为一类.例如学校里有很多学生,每个学生都是一个对象,而"学生"则是一个类,它包含了所有在学校学习的人. 在Java语言里,对象是一组描述对象的属性和操作方法的集合,其中属性表明对象的状态,方法表明对象的行为.类是对象的定义.一个对象具有哪些属性和方法,由类来决定.从编程角度看,类是一种复合数据类型,它封装了一组变量和方法(函数). 声明一个类

ASP入门教程-Recordset对象

一.Recordset 对象简述 Recordset 对象表示的是来自基本表或命令执行结果的记录全集.在任何情况下,该对象所指的当前记录均为集合内的单条记录.使用 Recordset 对象可以操作来自提供程序的数据,通过该对象几乎可以对所有数据进行操作.所有 Recordset 对象均使用记录(行)和字段(列)进行构造.Recordset 对象实际上是依附于 Connection 对象和 Command 对象之上的.通过建立及开启一个 Connection 对象,可以与我们关心的数据库建立连接: