一,java对象的三种状态
(1)瞬时状态
瞬时状态又称临时状态,当数据库中的数据不予对象关联时,这时对象就处在瞬时状态。临时状态的代码是不受Session管理的,也没有关联的。当java垃圾处理回收器运行时,如果瞬时状态的对象没有引用将被回收。
(2)持久状态
与数据库中数据有关联就是持久状态。持久状态下的代码时守Session管理和跟踪的。
(3)游离状态
脱离持久状态(脱离Session管理的类)的java对象就是游历状态。其实游离状态和瞬时状态很像,但不同的是游离状态是曾经关联过,而瞬时状态是没有关联过,并且数据库中有对应的数据。当java垃圾处理回收器运行时,如果游离状态的对象没有引用将被回收。
二,三种状态之间的转换
(1)瞬时状态转换为持久状态
使用Session的Save(),saveOrUpdate()等方法保存对象后,该对象的状态由瞬时状态转换为持久状态。使用Session的get()和load()获取到的对象是持久状态的。
(2)持久状态转为瞬时状态
执行Session的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有任何与数据库关联的对象。
(3)持久化状态转换为游离状态
执行Session的evict(),clear(),或close()方法,对象由原来的持久状态转为游离状态。
(4)游离状态转换为持久状态
执行Session的update()或者saveOrUpdate()方法,对象由游离状态转变为持久状态,该对象再次与当前Session关联。
(5)游离状态转换为瞬时状态
执行Session的delete()方法,对象由游离转换为瞬时。
三,脏检查和刷新缓存机制
(一)脏检查
当你持久化状态的对象发生改变时,hibernate不会立即提交执行sql改变数据库数据,session会为它的值类型复制一份快照,对比对象的值类型是否发生改变。当缓存机制运行时如果值类型改变了,就会执行相应的sql语句更改数据库。
(二)刷新缓存机制
需要注意的是,当session中的对象发生改变时,不会立即执行sql语句。而是在以下几种情况下执行:
(1)应用程序显示调用session.flush()方法时
(2)应用程序调用session.commit()方法时,session会隐式调用session.flush()方法。
四,更新数据方法
Hibernate的更新方法,包括update(),saveOrUpdate(),merge()。
(1)update可用于对象的游离状态转换为持久状态和更新数据。当参数的OID为空抛出异常。
(2)saveOrUpdate()当数据库没有关联信息(瞬时状态对象)时,调用save()方法,有(游离状态对象)则调用Update()方法。
(3)merge()方法,能够将传入的游离对象,复制一份拥有相同OID的对象到持久化状态中,通过对持久化状态对象的脏读检查来实现更新操作。如果传入的是瞬时对象则,复制其对象实现插入操作,并返回这一新的持久化状态对象。