声明
Session是一个持久化管理器,对数据库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须取得Connection实例,Session是Hibernate操作的基础,它不是线程安全的,但是我们可以用ThreadLocal(用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本,这样使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。)来保证线程的安全性。
状态描述
1.瞬时对象(Transient Object):
使用new操作符初始化的对象不能立刻就持久的。它们的状态时瞬时的,也就是说它们没有任何跟数据库相关联的行为,在数据库中没有与之匹配的记录,还没有让session管理。
总结:
1.没有被session管理
2.在数据库中没有与之匹配的记录
2.持久化对象(Persistent Object):
持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作的一一它们的状态事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
总结:
1. 纳入session管理
2.在数据库中有与之匹配的记录
3.当属性改变,在清理缓存是(脏数据检查)会自动和数据库同步
3.离线对象(Detached Object):
Session关闭之后,持久化对象变成为离线对象。离线表示这个对象不能再与数据库保持同步,它们不能再接受hibernate管理。
总结:
1. 没有被Session管理
2. 在数据中存在与之匹配的记录
图例注解
文字有时候是苍白的,如何更好展现自己的思维,需要我们借助图形的力量,这样我们的思维更加深刻,请看Session三种状态图,让你知道状态是如何进行转化。
(通过一系列的方法,改变Session状态)
三种状态的区分:
1. 有没有ID,(如果没有则是Transient状态)
2. ID在数据库中有没有
3. 在内存里有没有(Session缓存)
总结
想必大家对Session的状态有了一定的了解,那我们就在总结一下,便于我们理解的区别。
Transient对象:随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,就变为Persistent对象(持久性对象),没有纳入session的管理。 ( 内存中一个对象,没有ID,缓存中也没有)
Persistent对象:在数据库有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步。 ( 内存中有、缓存中有、数据库有(ID)Detached对象:也可能被垃圾回收器回收掉(数据库中存在对应的记录,只是没有任何对象引用它是指session引用),注引状态经过Persistent状态,没有纳入session的管理。 (内存有、缓存没有、数据库有(ID)