在继续学习之前,我还是觉得有必要和大家来扯扯jpa与Hibernate之间的关系。JPA全称Java Persistence API.是java5.0的一个规范,而hibernate可以看作这个规范的实现。就像接口和类的关系一样,jpa是接口,hibernate是类;但是这里要注意一下,是hibernate先流行起来了后才有了jpa。
Session概述
Session是Hibernate向应用程序提供操纵数据的最主要的接口,也是hibernate的核心接口,他提供了基本的保存,修改,删除,添加和加载操作。
Session缓存,有的叫Session缓存也有的叫一级缓存,位于缓存中的对象称为持久化对象,他和数据库中的记录是一一对应的,如果我们数据库有两天记录,id为1,name为’张三’,pwd为’123’、id为2,name为’李四’,pwd为’1234’;如果我们这个时候查询出这两条记录,那么在Session缓存中会存放这两条记录的对象,两个对象的属性与两条记录的字段值相同。注意:Session能够在某个时间点,按照缓存中对象变化来执行sql语句,这一过程称为刷新缓存。
站在持久化角度,hibernate把对象分为三种状态:持久状态、临时状态、游离状态。Session的特定方法,可以将对象从一种状态转换成另一种状态。
对象的三种状态
通过上面的图片可以更好的看出我们执行什么方法的时候,对象就会变成某种状态。
1.瞬时状态(Transient)
通过New创建对象,对象没有立即持久化,此时Java对象的状态为瞬时状态。Session对瞬时状态的java对象是一无所知的,此对象不在被别的对象引用时,java虚拟机会在一定时间段回收次对象。
2.持久状态(Persistent)
当对象与Session关联,被Session管理时,该对象就处于持久状态。
3.游离状态(Detached)
处于持久状态的对象,脱离与其关联的Session管理后,对象就处于游离状态。
状态转换:
1.瞬时状态转为持久状态
通过Session对象的save()、saveOrUpDate()方法保存对象或者使用get()、load()方法获取对象。
2.持久状态转为瞬时状态
执行Session的delete()方法后,对象由持久状态转为瞬时状态。
3.持久状态转为游离状态
执行Session的evict()、clear()、close()方法,对象由持久状态转为游离状态。
4.游离状态转为持久状态
重新获取Session对象,执行Session对象的update()、saveOrUpdate()方法将对象从游离状态变为持久状态,也就是说通过这两个方法,可以将对象重新与Session关联。
5.游离状态转为瞬时状态
执行Session的delete()方法。
注:处于瞬时状态或游离状态的对象不在被其他对象引用时,会被java虚拟机回收。
有的人也说hibernate中对象有四种状态,会多一种删除状态,因为在执行delete()方法删除数据的时候,对象会处于删除状态,当关闭session的时候对象处于临时状态。我个人还是倾向于说三种状态,delete()方法删除后,对象直接处于临时状态。