临时(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必须是没有修改过的,这方法挺适合做一个应用层。

java 游离状态_Hibernate 的三种状态 持久化 游离 临时 的关系相关推荐

  1. checkbox设置三种状态 qt_checkbox的三种状态处理

    checkbox只有两种值:选中(checked)或未选中(unchecked).它可以有任何值,但是表单提交时checkbox的值只能是checked或unchecked.它的默认值是uncheck ...

  2. Java中对象的三种状态

    转载自   Java中对象的三种状态 Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可 ...

  3. java三态_Java中对象的三种状态

    Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可达状态. 状态二:可复活态:从根节点开 ...

  4. CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占

    CPU被夺走的三种状态   .                           cpu的三种状态之              运行态      就绪态等待被调用             阻塞态 i ...

  5. 三态门三个状态vhdl_三态门输出的三种状态

    三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑1)或低电平(逻辑0),又可以保持特有的高阻抗状态,那么三态门输出的三种状态是什么呢? 三态门输出的三种状态 三态门的三种状态为:高电平,低电 ...

  6. hibernate三种状态:临时状态、游离状态、持久化状态

    三种状态的判断标准: con1:是否获得了与数据库现存记录相对应的oid con2:是否存在于Session缓存中 三种状态的定义: if(!con1 && !con2){ trans ...

  7. hibernate中的PO持久化对象及PO三种状态

    一,认识持久化对象PO: 在hibernate的应用程序中,每一个数据库中的表都对应一个持久化对象PO.PO可以看成是与数据库表相映射的java对象.最简单的PO对应数据库中某个表中的一条记录,多个记 ...

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

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

  9. hibernate 三种状态的转换

    一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...

最新文章

  1. python3基础知识点_入门Python3基础教程-知识点摘要
  2. 深度学习损失函数大全
  3. 2015美国数学建模a代码c语言,美国数学建模比赛2020 MCM C题代码详解
  4. 京东扳回一城,拼多多该小心了?
  5. Jenkins构建自动化任务
  6. struts文件上传以及中文乱码问题
  7. 20应用统计考研复试要点(part25)--简答题
  8. 【3】flink sink
  9. [BTS06]BizTalk2006 SDK阅读笔记(一) 角色
  10. python中对象包含几个部分_python中包含对象类型的两个列表的交集
  11. python中getopt函数_Python中getopt()函数的使用
  12. pytorch nn.Linear
  13. 不使用库函数将字符串转换为数字
  14. [POJ3020]Antenna Placement(二分图最大匹配,最小边覆盖)
  15. java中的各种集合排序
  16. 项目过程管理(八)延期和需求变更
  17. 国际物流、快递、空运、海运、FBA头程、专线分别都有什么不同
  18. 主要计算机网络设备及其主要用途
  19. python将doc文件转换docx
  20. 神经网络压缩(6):Exploring the Regularity of Sparse Structure in Convolutional Neural Networks

热门文章

  1. 使用Python+OpenCV实现姿态估计
  2. php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
  3. C++显示文字到桌面
  4. OKEx公链OKChain 下一个DeFi跑马场?
  5. ZigBee-Z-Stack协议栈 第一节 无线收发控制LED
  6. httpclient post方法【亲测可用】
  7. 开发板上烧上android,Android HAL实践:Mini6410开发板上的mokoid
  8. LDD6410 开发板完全开发手册1——LDD6410硬软件特性
  9. H3C三层交换机配置IP
  10. GPS 数据中的精度因子(DOP)与协方差之间的关系 (参考链接)