您的位置:首页 > 其它

Hibernate持久化对象的生命周期

2017-09-03 17:07 260 查看
1.瞬时对象(Transient Objects)

使用new操作符初始化的对象不是立刻就会持久化的,他们的状态是瞬时的。

(1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。

(2) 在数据库中没有对应的记录。

2.持久化对象(Persist Objects)

持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的———他们的状态在事务结束时同数据库进行同步。

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

(2) 持久化对象和数据库中的相关记录对应。

3.游离对象(Detached Objects)

Session关闭之后,持久化对象就变为游离对象。游离表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。

(1) 不再位于Session的缓存中,也可以说,游离对象不被Session关联。

(2) 游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

(前提条件是没有其他程序删除了这条记录)。

举例: User user = new User();

hibernate中对象的状态: 临时/瞬时状态、持久化状态、游离状态。

临时状态

特点:

直接new出来的对象;

不处于session的管理;

数据库中没有对象的记录;

持久化状态

当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。

处于持久化状态的对象,当对对象属性进行更改的时候,会反映到数据库中!

特点:

处于session的管理;

数据库中有对应的记录;

游离状态

特点

不处于session的管理;

数据库中有对应的记录

Session关闭后,对象的状态;

几种转换方法的对比:

1.get 与load

都是从数据库中加载数据封装为Java对象,使得java对象从自由态直接变为持久态;

但是有两点区别:①get返回对象可以为null,load返回值则始终不为null,找不到时会抛异常②get即时执行insert,而load则是在使用此对象时才执行insert

2.save,update与saveOrUpdate

save是将自由态转为持久态,而update是将游离态转为持久态,saveOrUpdate可以说是两者的综合,它执行时先判断对象的状态(主要是通过有无主键判断的),若是自由态,则save,若是游离态,则update

3.save与persist

两者都是将对象由自由态转为持久态,但返回值不同:save返回主键值,而persist不返回

4,saveOrUpdate与merge

两者都是将自由态或游离态对象与数据库关联,但merge不改变对象的原有状态

此外,对clear与flush方法也作介绍。clear是将session中的对象全部变为游离态,是对象由持久态变为游离态的一种方法(另外一种是关闭session);flush方法时为了使update操作能即时进行(正常情况下,只有在事务关闭时才进行update操作)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: