一,认识持久化对象PO:

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

PO类即持久化类,其实就是一个普通的JavaBean,只是要申明遵循一定的规则就是一个PO。

package PO;public class UserInfoPO {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

定义PO遵循以下三个原则:

1,为持久化字段声明私有属性且提供getter和setter方法

2,实现一个无参构造函数。所有的持久化类都要有一个默认的构造函数,这样hibernate就可以使用newInstance()来实例化它们。

3,提供一个标识符属性。

标识符属性,用于映射数据库表的主键字段。这个属性可以叫任何名字,其类型可以试任何原始类型,原始类型的包装类型,String或者Date。

二,持久化对象的三种状态:

Hibernate的PO对象有三种状态:临时状态,持久状态,脱管状态。

1,临时态

new命令开辟内存空间刚生成的Java对象就处于临时态。例如:UserInfoPO ui=new UserInfoPO();如果没有变量引用,他讲被java虚拟机回收。

临时对象在内存中是孤立存在的,它是携带信息的载体,不和数据库的数据有任何关联关系。在Hibernate中,可通过Session的save()或saveOrUpdate()方法将临时对象与数据库相关联,并将数据插入到数据库中,此时该临时对象状变成持久化对象。

临时对象的特征。临时对象具有以下特征:
(1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
(2) 在数据库中没有对应的记录

(3)他们没有任何跟数据库表相关联的行为

在以下情况下,Java对象进入临时状态:
(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。

2,持久态

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标志。如果使用delete方法。对应的持久化对象就会变成临时对象。因为数据库中对应的数据已被删除,该对象不在与数据库的记录相关联。

当session执行close()和clear()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象有数据库识别值,但不在hibernate持久层管理之下。

持久对象具有如下特点:
1)和session实例关联,位于一个Session实例的缓存中

2)在数据库中有关联记录。

Session的许多方法都能够触发Java对象进入持久化状态:
(1) Session的save()方法把临时对象转变为持久化对象。
(2) Session的load()或get()方法返回的对象总是处于持久化状态。
(3) Session的find()方法返回的List集合中存放的都是持久化对象。
(4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
(5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。

3,脱管态:

某持久化对象的session被关闭后,持久化对象就变成了脱管对象,这个对象不能再与数据库保持同步,他们不再受Hibernate管理。当脱管对象被重新关联上Session时,将再次转变成持久化对象。

脱管对象有如下特点:

1)不再位于Session的缓存中

2),因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。

脱管对象与临时对象的相同之处:

两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。

脱管对象与临时对象的区别

前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录

当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。

总结:

临时对象-----(get,load等)------>持久对象------(close方法关闭session)------>脱管对象

临时对象:不在session缓存,没记录,get,load转变持久对象

持久对象:在session缓存,有记录

脱管对象:不在session缓存,可能有记录,有数据库标识,可通过update,saveOrUpdate等,转变持久对象。

hibernate中的PO持久化对象及PO三种状态相关推荐

  1. Hibernate持久化对象的三种状态深入理解

    关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...

  2. Hibernate持久化对象三种状态

    持久化类类三种状态介绍 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录.它使用完成后,会被jvm直接回收掉, ...

  3. Hibernate之深入理解持久化对象

    持久化是将程序数据在持久化状态和瞬时状态间转换的机制,持久化类可以被hibernate保存到数据库并且从数据库中读取的类.简而言之,一个对象一旦被持久化了,那么这个对象的某个属性一旦改变了,数据库中的 ...

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

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

  5. Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;可以将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数

    Session操作过程中的pojo对象存在三种状态: 1)  瞬时态:该对象在数据库中没有对应的数据 2)  持久态:数据库中存在该对象对应的数据,同时操作该对象的Session也存在. 3)  游离 ...

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

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

  7. Hibernate 对象的三种状态

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

  8. Hibernate——(3)主键生成策略持久化类的三种状态

    一 持久化类 1.持久化:内存对象--->数据库(硬盘)Hibernate持久化的框架 持久化类:Java对象与数据库中的表建立映射关系            Hibernate就称为持久化类( ...

  9. 一家反欺诈公司的面试经历——3.hibernate中的session的三种状态

    hibernate中的对象有三种状态: 瞬时状态 (Transient),持久状态 (Persistent), 游离状态 1.瞬时状态 (Transient) 由 new 命令开辟内存空间的 Java ...

最新文章

  1. Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架
  2. Java设计模式笔记(1)单例模式
  3. Unit25 Congratulation
  4. js改变style中的值
  5. (转)WinForm中的各种表格控件
  6. Siverlight 自定义TreeView 显示带连接线的组织结构树
  7. 华为ensp配置vrrp
  8. deepin有线网卡无法连接网络
  9. Visual C++ 2015 Redistributable安装失败,错误代码0x80240017?
  10. 乘积最大python
  11. GAP:Learning Contextual Representations for Semantic Parsing with Generation-Augmented Pre-Training
  12. IDEA添加Java类注释模版
  13. 测试项目启动与研读需求文档
  14. 手撸Spring系列8:Spring AOP(理论篇)
  15. [编程题]蓄水池大作战 Golang 面相对象 无需算法 有手就行
  16. 【转发】日访问量百亿级的微博如何做缓存架构设计
  17. 智能手机的演变历程及发展趋势
  18. 【大数据之路5-1】数据仓库工具 Hive
  19. 计算机无法转换输入发,电脑输入法切换不了怎么办 输入法怎么设置快捷键图文教程...
  20. 微信小程序——首次使用显示“添加到我的小程序”

热门文章

  1. 初等数论--整除--两数乘积保持整除性
  2. 【Python整蛊合集】多份整蛊代码,发给朋友之后我.....(友尽系列推荐)
  3. python自动化—web页面操作之窗口切换
  4. [architecture]-处理器的顺序和乱序执行
  5. [reference]-ARM/TEE/security等论文中的缩写和参考文献
  6. 运维的基本知识点及分类工作
  7. http error code
  8. 让你轻松学会PHP版自动化SQL盲注工具-全库-全表-全字段-全字段值查询
  9. pwn学习总结(四)—— 堆基础知识(持续更新)
  10. 设计模式C++实现(13)——中介者模式