Session 接口是Hiberante面向应用程序提供的操作数据库的主要接口,他提供了基本的对象的保存 更新 修改 删除 和加载java对象的方法。
Session具有一个缓存。位于缓存中的对象我们称之为 持久化对象,持久化对象和数据库中的相关对西哪个想对应,Session能够在某个时间点按照缓存中的对象的变化来执行相关的SQL,来同步更新数据,上一节《Hibernate session浅见(1)》有讲到。
理解Session的缓存机制,就必须了解数据在Hibernare中的几种状态;
1: 临时状态 我们称之为Transient状态,该状态记录的是刚刚用new创建出来的对象,还没有被持久化,而且这个对象不处于Session的缓存当中。粗语临时状态的java对象我们就称之为 临时对象。
2:持久化状态 我们称之为persisent状态, 已经被持久化,并且加入到了Session的缓存当中,处于持久化的java对象我们就称为持久化对象。特别注意持久化类和持久化对象的差别。持久化类的实例可以处于临时状态,持久化状态,删除状态,以及游离状态,
而其中处于持久化状态下的类的实例才称之为 持久化对象。
3: 删除状态 (removed) :不处于Session的缓存当中,并且Session已经计划将其从数据库当中删除。而处于删除状态下对象就称为 被删除对象。
4:游离状态 (detached):已经被持久化但是不再处于Session的缓存当中,处于游离态的对象我们就称为 游离对象。
临时状态下的临时对象的特征:
* 在使用代理主键的情况下OID通常为null值
* 不处于Session的缓存当中
* 在数据库中没有对应的记录
在以下情况下,java对性竟如临时状态
* 当new的时候,此时数据库当中没有任何记录对应(当有对应的记录的时候不位于缓存当中就是游离的)。
* 在hibernare.use_identifier_rollback属性为true时,能将一个对象从持久化对象或者游离对象变成临时对象
持久化对象的特征:
* OID(或者说是key)不为null
* 位于Session实例的缓存当中
* 数据库中有与之对应的记录
* Session在清理缓存的时候,会根据持久对象的属性的变化来同步数据库
Session 能使对象进入持久态的几种方法或者说是可能:
* 调用save
* Session的load或者get的返回值一定是持久化的
*Query接口的list()返回的集合中的对象都是持久化的
* update 、lock saveOrUpdate可以使游离态的对象变成持久化的
* 当一个持久化的对象关联一个临时对象,在允许级联的时候,Session在清理缓存的时候也会把临时对象转化为持久化
对象。
被删除对象的特征:
* OID不为null
* 从一个Session的实例的缓存中删除
* 被删除的对象和数据库中的相关记录对应
* Session已经计划将其将其在数据库中删除
* Session 在执行清理缓存的时候,会执行的SQL delete 语句,删除数据库的对应相应记录
* 一般情况下,不应该再使用被删除的对象
在以下情况下java对象进入删除状态
* 在Hibernare的配置文件中的hibernare.use_identifier_rollback属性为默认值false的情况下,Session的delete方法 把持久 对习惯及其游离对象变化为被删除对象。
* 级联删除关联的对象的时候
游离对象的基本特征:
* OID 不为null
* 不位于Session的缓存当中
* 游离对象数据库当中可能还存在与它对应的记录(在没被删除的情况下)
在以下的情况下会变为游离对象
* 当调用 close
* 当调用evict
* 当调用clear
区别这四种状态主要是根据其特征来判定,游离与临时的相同两者都不被Session关联,因此不会保证在Session当中保持同步,区别是游离对象是经过持久而来可能在数据库中存在与之对应的记录,而临时的不存在于数据库当中。游离对象与被删除对象相同之处在于都位于缓存中,并且在数据当中可能存在与之对应的记录,区别是游离对象与Session脱离了关系,而被删除的对象,Session会计划将其从数据库中删除,等到Session清理缓存的时,会执行相应的SQL delete语句,从数据库中删除。