hibernate的对象三种状态
transient(瞬时)
persistent(持久化)
detached(游离)
瞬时状态:
1.刚new出来一个对象obj,obj在内存孤立存在,obj是携带信息的载体,obj没有被保存到数据库中(换句话:obj没有被session进行持久化)
扩展知识:
没有变量引用该对象,它将被垃圾回收器(gc)回收;
持久化状态:
1.该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识
2.和session实例关联;
游离状态:
游离对象拥有数据库的识别值,但已不在持久化管理范围之内(session中不存在该对象)。
游离对象具有如下特点:
(1)本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
(2)比瞬时对象多了一个数据库记录标识值.
打比方:我们可以认为session对象就是一个持久化对象的宿主,
一旦这个宿主失效,那么这个实体就处于游离状态.
Session的调用不同方法,对对象的不同影响:
save()方法 ---- 将一个临时对象转变为持久对象。
update()方法 ---- 将一个游离对象转变为持久对象。
lock()方法 ---- 将对象同Session相关联而不强制更新。
merge()方法 ---- 拷贝指定对象的状态到具有相同对象标识符的持久对象。
saveOrUpdate() ---- 方法对于临时对象,执行save()方法,对于游离对象,执行update()方法。
load() 方法和get()方法 ---- 可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
delete()方法 ---- 从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条 delete语句。如果传入的参数是游离对象,先使分离对象与 Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
evict()方法 ---- 从Session的缓存中删除一个持久对象。
游离对象和临时对象异同:
两者都不会被Session关联,对象属性和数据库可能不一致;
瞬时状态:对象缺乏与数据库表记录之间的联系,
游离状态:只不过是脱离了session这个数据库操作平台而已,
游离对象的引用依然有效(在内存中还有对象),对象可以继续被修改,当它重新被关联到某个新的Session上时,
会再次变成持久对象(脱管状态期间的改动将被持久化到数据库上)。
游离对象拥有数据库识别值id,所以它可以通过update(),saveOrUpdate(),lock()等方法,
再度与持久层关联。
注意一下几点:
1. 如果一个持久化状态对象A,对该对象A进行各种修改,或者调用多次update、save方法,
hibernate都不会发送sql语句,只有当事务提交,hibernate才会拿当前对象A与之前保存在session中的持久化对象进行比较,
如果不相同就发送一条update的sql语句,否则就不会发送update语句
2. 通过调用save方法、update方法或saveOrUpdate()方法可以使该对象变成持久化对象,
如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比
较,如果不同,则发送一条update语句,否则就不会发送update语句.
3. session.clear(),会将session的缓存对象清空
4. 试图修改一个持久化对象的ID的值的话,就会抛出异常
5. 在session的缓存中不能存在两份拷贝,否则会抛出异常
6. session的merge方法,作用是解决一个持久化对象两份拷贝的问题,该方法会将两个对象合并在一起成为一个对象。
7. 持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化 对象是脏的(Dirty)。