三种状态的基本概念:

1。  临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据。

使用new创建的对象,久化,没有处于Session中,处于此状态的对象叫暂时对象;

2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据。

已经持久化。增加到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;

3,  游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。

特点:已经持久化,但不在Session缓存中。

处于此状态的对象叫游离对象;

×√

暂时状态

(Transient)

持久化状态

(Persistent)

游离状态

(Detached)

是否处于Session缓存中

×

×

数据库中是否有相应记录

×



游离对象和暂时对象异同:

两者都不会被Session关联,对象属性和数据库可能不一致;

游离对象有持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;



Hibernate和SQL的关系:

在操作了hibernate的方法如save()等后。并没有直接生成sql语句,去操作数据库。而是把这些更新存入Session中。仅仅有Session缓存要被更新时,底层的sql语句才干运行,数据存入数据库。



以下举例说明:

一,Session.save(user)执行机理。

1,把User对象增加缓存中。使它变成持久化对象。

2。选用映射文件指定的标识生成ID。

3,在Session清理缓存时候运行:在底层生成一个insert sql语句,把对象存入数据库;



注意:在你运行Session.save(user)后,在Session清理缓存前。假设你改动user对象属性值。那么终于存入数据库的值将是最后改动的值;此过程中ID不能被改动;



二,Session.delete(user)执行过程。

假设user是持久化对象,则运行删除操作,相同底层数据库的运行条件是:在Session清理缓存时候;

假设user是游离对象:

1。将user对象和Session关联。使之成为持久化对象;

2。然后依照user 是持久化对象的过程运行;

三态之间的转换方法:

①怎样成为自由态?对象通过构造方法成为自由态。持久态和游离态则通过session的delete方法成为自由态

②怎样成为持久态?对象能够由session的load或get方法直接成为持久态;自由态对象能够通过save。saveOrUpdate或persist方法成为持久态。游离态对象则能够通过update,saveOrUpdate成为持久态

③怎样成为游离态?游离态仅仅能由持久态转换而来。通过close或clear方法实现。

几种转换方法的对照:

1.get 与load

都是从数据库中载入数据封装为java对象,使得java对象从自由态直接变为持久态;

可是有两点差别:①get返回对象能够为null。load返回值则始终不为null,找不到时会抛异常②get即时运行insert,而load则是在使用此对象时才运行insert

2.save,update与saveOrUpdate

save是将自由态转为持久态。而update是将游离态转为持久态,saveOrUpdate能够说是两者的综合,它运行时先推断对象的状态(主要是通过有无主键推断的),若是自由态,则save。若是游离态。则update

3.save与persist

两者都是将对象由自由态转为持久态,但返回值不同:save返回主键值,而persist不返回

4,saveOrUpdate与merge

两者都是将自由态或游离态对象与数据库关联。但merge不改变对象的原有状态

而且,至clear与flush该方法也可以引入。clear这是session这些对象都成为自由状态。由一个自由国家的持久化对象的方法来说明(第二个被关闭session);flush为了使方法update操作可立即(在正常情况下,。只有当所述交易被关闭update操作)。

最新文章

  1. $.data(data , "")
  2. 短语密码(blowfish_secret)的设置
  3. 在EDK里面添加ISE IP core的方法
  4. POJ2947Widget Factory(高斯消元解同模方程)
  5. js中的相等与不等运算
  6. SQL分组查询GroupBy
  7. 利用 SysRq 键排除和诊断系统故障
  8. C++ Input & Output
  9. [转]Even when one byte matters
  10. 动态的改变标签内的src属性
  11. 3D Lut 电影级调色算法 附完整C代码
  12. CF 543C Remembering Strings
  13. Android远程桌面助手(Build 0662)
  14. Python面向对象进阶和socket网络编程-day08
  15. 如何让gitbook与github仓库关联
  16. dos下编译java
  17. jQuery基础语法
  18. linux内核分析第二四学习报告
  19. Oracle 扩展表空间大小的几种方式
  20. LeetCode题解之Longest Continuous Increasing Subsequence

热门文章

  1. 泛泰A900 刷4.4中国民营TWRP2.7.1.1版本 支持自己主动识别移动版本号(世界上第一)
  2. Hadoop Java Hdfs API
  3. Duanxx的C++学习 : 数字转换String
  4. Hbase在的应用经验的统计
  5. html + CSS
  6. (转).net webconfig使用IConfigurationSectionHandler自定section
  7. 绑定枚举到dropdownlist
  8. Android两个注意事项.深入了解Intent和IntentFilter(两)
  9. 基于 Android 的 3D 视频样本代码
  10. Sql数据类型转换