Hibernate对象状态
在hibernate中有三种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
通过自己在网上的搜索,也了解到,这三种状态也可以称作:临时状态、持久状态、游离状态。
一、三种状态介绍:
(1) 瞬时状态:
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)。
瞬时状态的特点有:
1、 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录。
2、 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。

举例:
User user=new User(); //user是一个瞬时对象,在数据库的表中是没有记录和该对象相对应的。和session没有关系。
user.setName(“ddd”);
user.setBirthday(new Date());

session.save(user); //持久化状态

(2) 持久状态:
持久(Persistent)是实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。开发者不需要手动执行Update。将对象从持久(Persistent)状态编程瞬时(Transient)状态同样也不需要手动执行delete语句。
持久对象具有如下特点:
1、 和session实例关联;
2、 在数据库中有与之关联的记录。
3、 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录。
举例:
Session session = factory.openSession();
Transaction tx = session.beginTransaction();

session.save(stu); // persistent持久化状态
System.out.println(stu);

tx.commit();
session.close(); //执行close()方法之后,就会由持久对象转换成脱管对象

System.out.println(stu); // 脱管对象

(3)脱管状态:
与持久(Persistent)状态对象关联的Session被关闭后,对象就变为脱管(Detached)的。对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上,会再次转变为持久(Transistent)的(在脱管Detached其间的改动将被持久化到数据库)。这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work).
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
1、 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2、 比瞬时对象多了一个数据库记录标识值。
3、 不在于Session相关联。
4、 脱管对象一定是由持久态对象转化而来。
首先是我们的UML图转换:以及解析:

[img]http://dl.iteye.com/upload/attachment/604687/bd2e06d1-e62c-3dfe-aa35-12b0092c2048.bmp[/img]

对以上图形的解析:
1、当一个对象被new了以后此对象处于瞬时态(Transient);
2、然后对此对象执行session的save() 或者saveOrUpdate()方法后,此对象被放入session的一级缓存进入持久态.
2、当再对此对象执行evict()/close()/clear()的操作后此对象进入游离态(Detached)
4、游离态(Detached)和瞬时态(Transient)的对象由于没有被session管理会在适当的时机被java的垃圾回收站(garbage)回收.
5、执行session的get()/load()/find()/iternte()等方法从数据库里查询的到的对象,处于持久态(Persistent).
6、当对数据库中的纪录进行update()/saveOrUpdate()/lock()操作后游离态的对象就过渡到持久态 
7、处于持久态(Persistent)与游离态(Detached)的对象在数据库中都有对应的记录.
8、瞬时态(Transient)与游离态(Detached)的对象都可以被回收可是瞬时态的对象在数据库中没有对应的纪录,而游离态的对象在数据库中有对用的纪录。

对象状态的总结:(如下图所示)

[img]http://dl.iteye.com/upload/attachment/604689/ce10c0fd-6863-3074-abac-aa9913012a40.bmp[/img]

1、操纵持久化对象-save()
(1)Session 的 save() 方法使一个临时对象转变为持久化对象
(2)Session 的 save() 方法完成以下操作:
(3)把 News 对象加入到 Session 缓存中, 使它进入持久化状态
(4)选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
(5)计划执行一条 insert 语句,把Customer对象当前的属性值组装到insert语句中
(6)Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系. 当 News 对象处于持久化状态时, 不允许程序随意修改它的 ID
2、 操纵持久化对象-update()
(1)Session 的 update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句.
[img]http://dl.iteye.com/upload/attachment/604695/227322e8-d8d5-32cb-b849-2e1727749f05.bmp[/img]

3、操纵持久化对象-saveOrupdate()
saveOrUpdate:
该方法同时包含save和update方法,如果参数是临时对象就用save方
法,如果是游离对象就用update方法,如果是持久化对象就直接返回。
如果参数是临时对象就用save方法

[img]http://dl.iteye.com/upload/attachment/604697/ece95fa7-2a72-367e-a85b-d889f90c432b.bmp[/img]

如果是游离对象就用update方法

[img]http://dl.iteye.com/upload/attachment/604703/5ea78045-0a2c-37fd-a7fb-e9b04a6dfd7a.bmp[/img]

如果是持久化对象就直接返回,不执行操作

[img]http://dl.iteye.com/upload/attachment/604706/be95b6da-c7f7-31a8-a3cd-668cc4406229.bmp[/img]

二、使对象持久化:
Hibernate认为持久化类(persistent class)新实例化的对象是瞬时(Transient)的。我们可以通过将瞬时(Transient)对象与session关联而把它变为持久(Persistent)的。
DomesticCat fritz=new DomesticCat();
fritz.setColor(Color.GINGER);
fritz.setSex(‘M’);
fritz.setName(“Fritz”);
Long generatedId=(Long) sess.save(frize);

如果Cat的持久化标识(identifier)是generated类型的,那么该标识(indentifier)会自动在save()被调用时产生并分配给cat。如果Cat的持久化标识(identifier)是addigned类型的,或是一个复合主键(composite key),那么该标识(identifier)应当在调用save()之前手动赋予给cat。你也可以按照EJB3 early draft中定义的语句,使用persist()替代save()。
(1) persist()使一个临时实例持久化。然而,它不保证立即把标示符值分配给持久性实例,这会发生在冲刷(flush)的时候。Persist()也保证它在事务边界外调用时不会执行insert语句。这对于长期运行的带有扩展会话/持久化上下文的会话是很游泳的。
(2) save()保证返回一个标示符。如果需要运行insert来获取标示符(如“identity”而非“sequence”生成器),这个insert将立即执行,不管你是否在事务内部还是外部。这对于长期运行的带有扩展会话/持久上下文的会话来说会出现问题。
此外,你可以用一个重载版本的save()方法。

Hibernate对象状态相关推荐

  1. Hibernate对象状态之间的神奇转换

    状态分类 在Hibernate框架中,为了管理持久化类,Hibernate将其分为了三个状态: 瞬时态(Transient Object) 持久态(Persistent Object) 脱管态(Det ...

  2. SSH学习-Hibernate对象生命周期管理

    Hibernate对象就是java中的实体对象,管理就是在实体对象的生命周期内被Hibernate的操作,Hibernate对象的生命周期其实就是实体对象的生命周期(从创建到最后被GC回收),期间对实 ...

  3. Hibernate 几种对象状态

    Hibernate 中四种对象状态 临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中.处于临时状态 的Java 对象被称为临时对象. 持久化状 ...

  4. 【Hibernate框架开发之五】Hibernate对象的三种状态Session常用方法

    1. Hibernate对象的三种状态:(图解如下:) 如图所示,Hibernate对象有三种状态,1.Transient  2.Persistent 3.Detached; 三种状态的区别如下: 1 ...

  5. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  6. Hibernate 对象的三种状态

    Hibernate 对象的三种状态 瞬时(transient): 由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的.瞬时(Transient ...

  7. Hibernate开发和对象状态

    Hibernate开发和对象状态 Hibernate开发三种方式 1.由Domain object -> mapping->db.(官方推荐) 2.由DB开始,用工具生成mapping和D ...

  8. 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法

    1. 持久化实体 Serializable save(Object obj) : 将obj对象变为持久化状态,该对象的属性将被保存到数据库. void persist(Object obj) : 将o ...

  9. Hibernate学习笔记_核心幵发接口及三种对象状态

    核心接口开发  (重点)                                                  一,  Configuration a)   AnnotationConfi ...

最新文章

  1. 1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜
  2. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)
  3. 取消数据源的自动创建,使用Seata对数据源进行代理
  4. 我必须要吐槽,你们的数据管理都是错的,这才是规划和产出
  5. ubuntu 14.04 环境下打开xls、pdf与png文件
  6. x内存满白苹果解决_iphone12pro max无限白苹果重启怎么办
  7. 嵌入式系统——指令操作扩展
  8. 2017web前端实习生面试总结 - 360奇舞团 京东商户物流
  9. [转载] 在 CentOS 7 中安装 MySQL 8
  10. .vbb格式转换为txt格式(matlab实现),在此以Caltech Pedestrian Dataset数据集的annotations为例
  11. 《人工智能-一种现代的方法》阅读笔记
  12. 网速魔法师 v1.8 官方安装版
  13. 为什么程序员喜欢用dark mode深色模式
  14. p17.matplotlib:图中图
  15. 【ZOJ2750】Idiomatic Phrases Game(最短路)
  16. openlayers6【五】地图图层数据来源 source 详解
  17. 推荐几个检索论文及代码的网站
  18. 关于gb2312编码的xml解析
  19. 如何制作商场超市地摊清仓大甩卖广告语录音
  20. Unity学习笔记(六)---------------GameObject的Active与InActive

热门文章

  1. Python编程:从入门到实践关于pi,百万位圆周率,pi_million_digits.txt,分享给大家
  2. android中contains的用法
  3. 趣谈唯一邀请码生成方法
  4. Linux学习笔记(一) -- 在虚拟机中安装Ubuntu 18.04
  5. 你想过逃离上海吗?不用4小时
  6. python流量监控脚本
  7. C语言:Fibonacci数列的递归解法和非递归解法
  8. ICD建模功能约束(详见DL/T860.73附录B)
  9. matlab 定时器开始无法停止,计时器程序无法停止计时
  10. edge/chrome更新113版本后页面崩溃 STATUS_STACK_BUFFER_OVERRUN解决方案