Hibernate的三种状态

来源:互联网 发布:js 拖拽 div 互换位置 编辑:程序博客网 时间:2024/06/04 23:26

transient瞬时态 persistent持久化状态 detached离线状态,面试重点
这里写图片描述


一:临时状态(Transient):
也叫瞬时状态,在一个对象刚被创建的时候,比如People people = new People(),它没有持久化,并没有处于Session的缓存中,这种状态的对象叫就是临时对象;

二:持久化状态(Persistent):
已经执行了session的save()方法,已经持久化,加入到了Session缓存中,并且在数据库中具有对应的记录,并拥有一个持久化标识。处于此状态的对象叫持久对象。
此时如果使用hibernate的delete()方法,对应的持久对象就变成上面的瞬时对象,因为数据库中的对应数据已被删除,该对象不再与数据库的记录关联。 持久对象具有如下特点: 1. 和session实例关联; 2. 在数据库中有与之关联的记录。
当一个session执行close()或clear()、evict()之后,持久对象变成下面要讲的脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下,也就是它在session缓存中的记录已经被删除了。

三:游离状态(Detached):
也叫脱管状态,持久化对象脱离了Session的对象。如当session关闭时,Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;因关闭session而变成游离态的可以通过lock、save、update变成持久态 。

注意:瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象。

案例:
1:hibernate会发出一条insert的语句,执行完save方法后,该user对象就变成了持久化的对象了
2:在调用了save方法后,此时user已经是持久化对象了,被保存在了session缓存当中,这时user又重新修改了属性值,那么在提交事务时,此时hibernate对象就会拿当前这个user对象和保存在session缓存中的user对象进行比较,如果两个对象相同,则不会发送update语句,否则,如果两个对象不同,则会发出update语句。

3:如果一个对象以及是持久化状态了,那么此时对该对象进行各种修改,或者调用多次update、save方法时,hibernate都不会发送sql语句,只有当事物提交的时候,此时hibernate才会拿当前这个对象与之前保存在session中的持久化对象进行比较,如果不相同就发送一条update的sql语句,否则就不会发送update语句
4:当session调用load、get方法时,此时如果数据库中有该对象,则该对象也变成了一个持久化对象,被session所托管。因此,这个时候如果对对象进行操作,在提交事务时同样会去与session中的持久化对象进行比较,因此这里会发送两条sql语句

5:当我们load出user对象时,此时user是持久化的对象,在session缓存中存在该对象,此时我们在对user进行修改后,然后调用session.clear()方法,这个时候就会将session的缓存对象清空,那么session中就没有了user这个对象,这个时候在提交事务的时候,发现已经session中已经没有该对象了,所以就不会进行任何操作,因此这里只会发送一条select语句

6:对于离线对象,如果要使其变成持久化对象的话,我们不能使用save方法,而应该使用update方法

总结:

①.对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象(Transient)
②.瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句
③.离线对象就是,数据库存在该对象,但是该对象又没有被session所托管

总结:
hibernate对象三种状态的区分关键在于:
  a)有没有id
  b)id在数据库中有没有
  c)在内存中有没有(session缓存)
三种状态:
  a) transient :内存中一个对象,没id,缓存中也没有
  b)persistent:内存中有对象,缓存中有,数据库中有(id)
  c)detachd:内存有对象,缓存没有,数据库有

参考博客:
http://www.cnblogs.com/xiaoluo501395377/p/3380270.html
http://www.cnblogs.com/jyh317/p/3666566.html

http://www.cnblogs.com/lihaoyang/p/4854186.html
http://blog.csdn.net/fg2006/article/details/6436517/
http://blog.csdn.net/liujiahan629629/article/details/21474525(重点)

原创粉丝点击