Hibernate学习:二(持久化对象的生命周期),有参考其他资料

持久化对象在整个hibernate框架中运行,一共有四种不同的状态产生:

Hibernate学习:二(持久化对象的生命周期),有参考其他资料

临时状态(Transient Objects)通过 new 创建的对象,是临时对象,如果临时对象不做任何操作的话,会被gc回收,说明这种状态的对象没有与数据库有交互的能力,存在于session缓存外

临时对象的特征总结:1.是否在session缓存里面 2.是否与数据库有交互能力 3.OID是否有值

1.不处于Session缓存中,没有与任何Session实例关联

2.数据库中没有相对应的记录

3.编码的时候可以为临时对象设置OID值,但最终Hibernate不会采用,它用的是内置的主键生成策略

以下情况,java对象进入临时状态

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

持久化对象(Persist Objects):持久化对象是具有数据库标识的实例,由Session统一管理,持久实例是在事务中操作,他们的状态在事务借宿的同时与数据库同步。当事务提交时,通过执行SQL的INSET,UPDATE和DELETE语句把内存中的状态同步到数据库中

持久化特征总结:

1.位于Session实例的缓存中,也可以说持久化对象被一个Session实例关联

2.持久化对象鱼数据库中的记录相对应

3.Session在清理缓存时(session.flush),会根据持久化对象的属性变化,来同步更新数据库

4.Hibernate 保证在同一个Session实例的缓存中,数据库表中的每条记录只对应惟一的持久化对象,即 hibernate会为持久化对象分配惟一的OID标识这个持久化对象

 以下情况,java对象进入持久化状态

1.通过 save()方法将一个临时对象转为持久对象

2.通过get()或load()方法将数据库表中的记录转成持久化对象

3.通过find()方法返回的List集合中的对象也是持久化对象

4.通过update()或saveOrUpdate()和lock()方法使 游离对象 转化为 持久化对象

游离对象(Detached Objects):Session关闭后,或者清除Session缓存和清除指定缓存,持久化对象变为有理对象,此时该对象不能再与数据库交互,也就是不能同步,不再受Hibernate管理

游离对象的特征总结:

1.不在Session一级缓存里面,但又有OID值。

2.数据库里也有相对于的记录存在(除非其他操作删除了该记录),但不再具有和数据库交互的能力,不能再同步

游离对象和临时对象区别:两者都不被session关联,就算属性变化也不能与数据库保持同步,而游离对象是由持久化对象转变而来,所以数据库中有对应记录(除非删除),而临时对象在数据库并没有记录,用恰当比喻来说,游离对象相当于 退休老人,退休老人不在岗位上,但资料库里还有他以前相关的记录,而临时对象是还没正式进入这家公司的年轻人,还没上岗,资料库也没有年轻人的记录。

转载于:https://my.oschina.net/5365437/blog/182436