Hibernate对象状态 
临时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为临时(Transient)的。临时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果临时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)

持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。

游离(Detached) - 与持久(Persistent)对象关联的Session被关闭后,对象就变为游离(Detached)的。 对游离(Detached)对象的引用依然有效,对象可继续被修改。游离(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。 这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。 我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)。

Hibernate中对象的游离状态是指Session关闭之后,持久化对象变成离线对象,离线对象就不能同数据库同步,也不再受Hibernate管理。操作 处于游离态对象 经常会报 session已关闭的错误。

假设场景:
有两个类, Team, Person. 映射关系是Team一对多Person, 采用lazy fetch策略。
session begin
Team t = *Dao.get()
session end
t.getPersons()// 出错
如果是用spring管理session的情况,事务外操作t.getPerons()也跟上面情况一样。
这种情况在生产环境多表现为在jsp页面操作 t对象时出错。

解决方法:
1. 取消lazy fetch策略
缺点:会导致过多的数据库访问,因为是一对多的情况。
2. 在事务内就先把关联的对象取出
缺点:会导致service层方法不统一,因为要分开取出与不取出的情况。
3. 使用spring的 openSessionInview机制
缺点: session打开的时间比较长, 使用不好可能会导致out of memory

一个游离态的对象转换为持久战态,有以下几种方法:

1、session.saveOrUpdate(object)。这语句会把游离态的PO转为持久态的PO并提交给数据库

2、session.merge(object)。这语句会把游离态的PO转为持久态的PO,并进行合并操作。

3、session.lock(object, LockMode.NONE)。这语句只会把游离态的PO转为持久态PO,不作其他操作。不过,PO必须是没有修改过的,这方法挺适合做一个应用层

Hibernate三态,游离态相关推荐

  1. Hibernate的游离态与持久态转换(转)

    本文转自:http://blog.csdn.net/sdbany/article/details/2257591 在Hibernate中,一个PO可能经过长时间的操作,session已过时关闭,此时P ...

  2. Hibernate的游离态与持久态转换

    在Hibernate中,一个PO可能经过长时间的操作,session已过时关闭,此时PO已经是一个游离态的对象,这时要转换为持久战态,有下面几种方法: 1.session.saveOrUpdate(o ...

  3. Hibernate笔记+相关面试题

    持久化框架 一.持久化:IO.数据库(内存和磁盘进行交互) 对象的瞬时状态和持久状态相互转换的过程,称之为持久化. 持久化是双向的 狭义的理解: "持久化"仅仅指把域对象永久保存到 ...

  4. ffmpeg视频压缩速度_使用ffmpeg修改视频速度

    ffmpeg视频压缩速度 I watch a lot of sports and recently I've become fascinated with some of the methodolog ...

  5. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: ...

  6. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)...

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  7. 关于Hibernate中的临时态, 持久态, 游离态

    三态的基本概念: 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: ...

  8. Hibernate对象的三种状态(瞬时态,持久态,游离态)

    1.  瞬时状态 (瞬态) 当我们通过Java的新的关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:  客户客户=新客户("zx",27,图片); 这时客户对象就 ...

  9. hibernate中对象的三种状态瞬时态,持久态,游离态区分

     1.瞬时态. hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它也是瞬时态了,因为此时,他们在数据库中没有对应 ...

最新文章

  1. 计算机科学家证明,为什么更大的神经网络可以做得更好
  2. Linux jobs等前后台运行命令详解
  3. 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )
  4. python内置的读取文件函数_python基础(内置函数+文件操作+lambda)
  5. MySQL MyISAM和InnoDB存储引擎的比较
  6. xslt 标签取集合第一条数据_1+x证书Web前端开发中级理论考试(试卷1)
  7. 苦逼or高薪程序猿,你选谁?WEB前端这个行业普遍年薪20万+,吃鸡如开挂!
  8. python mysql 基于 sqlalvhrmy_Python基于DB-API操作MySQL数据库过程解析
  9. python中stacked_python – Django管理员StackedInline定制
  10. linux主机中util啥意思,util-linux是什么软件
  11. cli命令行配置路由器_2.3.3 使用CLI执行基本路由器配置
  12. Leetcode-213:打家劫舍 II
  13. 在sae中运行web.py应用
  14. scrapy下载图片第一波
  15. flink 部署模式和运行时架构(会话模式、单作业模式、应用模式,JobManager、TaskManager,YARN 模式部署以及运行时架构)
  16. 2008服务器系统之家,UEFI+GPT模式安装Windows server 2008 R2教程
  17. 不要时刻忘记保持微笑
  18. [Games 101] Lecture 13-16 Ray Tracing
  19. 中国医学影像工作站市场趋势报告、技术动态创新及市场预测
  20. Python入门必学,用Python练习画个美队盾牌

热门文章

  1. 手机闪存速度排行_手机速度太慢?闪存真的很重要
  2. 探索样机在创新中的关键角色,文章深入解析!
  3. Createprocess 函数 调用出错以及解决
  4. 11贴图控件-09图片背景日历-imagecalendar
  5. What is activeX?
  6. 【一起学OpenFOAM】03 OpenFOAM基本使用流程
  7. 开发板上烧上android,Android HAL实践:Mini6410开发板上的mokoid
  8. 爪爪博士:教你怎样去读懂猫咪的语言
  9. SQL的基础学习:一、检索和排序数据
  10. python红楼梦人数统计结果_Python学习分析红楼梦社交网络,意外发现一个有影响力的神秘人物...