Hibernate的PO对象有三种状态:临时状态(又称临时态)、持久状态(又称为持久态)和脱管状态(又称为脱管态、游离态)。处理持久态的对象也称为PO,临时对象和脱管对象也称为VO。
1、临时态:
简单来说,由new命令开辟内存空间时刚生成的java对象就是处于临时态。
比如:
User user = new User();
如果没有变量对该对象进行引用,它将被java虚拟机回收。
临时对象在内存中是孤立存在的,它是携带信息的载体,不和数据库的数据有任何关联关系。在hibernate中,可以通过Session的save()或者savaOrUpdate()方法将临时对象与数据库相关联,并插入数据库,转变成持久化对象。
2、持久态:
持久化状态,该对象在数据库中具有对应的一条记录,并拥有一个持久化标识(如:Integer id 其实对应的就是记录表的一个主键)。如果hibernate 中的Dao层方法delete(),就会把对应的持久化对象变为临时对象,对应数据库中的记录也会被删除,不再与数据库的记录关联。
总结一下,持久化对象特点:
(1)和Session实例关联;
(2)与数据库中有与之关联的记录;
3、脱管态(游离态):
当与某持久化对象关联的Session被关闭后,该持久化对象转变为脱管对象。脱管对象被重新关联到Session上时,将再次转变成持久化对象。
注意:脱管对象拥有数据库的识别值,可通过update()、savaOrUpdate()等方法,转变成持久对象。
脱管对象特点:
(1)本质上与临时对象相同,在没有任何变量引用它时,JVM会在核实的时候将它回收;
(2)比临时对象多了一个数据库记录标识值;
4、Session中常用方法对PO对象状态的作用
临时状态、持久化状态和脱管状态(也就是游离状态),三种状态转化的方法都是通 过session来调用,瞬态到持久态的方法有save()、saveOrUpdate()、get()、load();持久态到瞬态的方法有 delete();游离态到持久态的方法有update()、saveOrUpdate()、lock();持久态到游离态的方法 有:session.close()、session.evict()、session.clear()。
5、save()和update()的区别
save()的作用是保存一个新的对象,update()可以把一个脱管状态的对象(一定要和一个记录对应)更新到数据库。
6、update()和saveOrUpdate()区别
saveOrUpdate()方法基本上就是合成了save()和update()
通常下面的场景会使用到update()和saveOrUpdate()::
(1)程序在第一个Session中加载对象,接着把Session()关闭;
(2)该对象被传递到表示层;
(3)对象发生了一些改动;
(4)该对象被返回到业务逻辑层最终到达持久层;
(5)程序创建第二个Session,调用第二个Session的update()方法持久化这些改动。