[Hibernate 2]session的三种状态 一、Session的特点和获取 二、Session的生命周期 三、实例解析session的三大状态 四、总结

[Hibernate 2]session的三种状态
一、Session的特点和获取
二、Session的生命周期
三、实例解析session的三大状态
四、总结

特点:

Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。
 Session也称为持久化管理器,因为它是与持久化有关的操作接口。
 Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
它与Web层的HttpSession没有任何关系。

获取:


二、Session的生命周期

[Hibernate 2]session的三种状态
一、Session的特点和获取
二、Session的生命周期
三、实例解析session的三大状态
四、总结

在session的生命周期里面,我们可以发现,session主要有三个状态:Transient(瞬时)、Persistent(持久化)、Detached(脱管)

2.1,瞬时(Transient )

使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。 

2.2,持久化(Persist )

持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。

2.3,脱管(Detached )

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


三、实例解析session的三大状态

控制台打印的sql语句:

Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?


要将一个脱管对象变为一个持久化对象,应该调用update方法,而不是save方法。如果调用save方法,那么Hibernate会根据其id生成策略执行insert语句,向数据库里插入一条数据。


四、总结

当一个对象处于持久化状态的时候,如果对该对象多次调用update、save方法,或者多次修改,hibernate都不会执行相应的sql语句。当事务提交时,hibernate会将当前对象与之前保存在session中的对象进行对比,如果不相同,就执行update语句,否则不执行。

状态/存在位置 内存 缓存 数据库
瞬时状态
持久状态
脱管状态