瞬时状态(Transient)
通过new创建对象后,对象并没有立刻持久,他并没有与数据库打交道,此时状态为瞬时状态。
持久状态(Persistent)
当对象与session关联,被Session管理时,它处于持久状态,处于持久状态的对象拥有数据库标识,有两种方法通过Session
get()方法,或者是load()方法重数据加载数据的时候,第二种瞬时状态,Session的save()方法或SaveorUpdate()方法时,Java对象与Session发生关系。
对于处于持久状态的对象,Session会持续跟踪和管理,如果Hibernate会选择合适的时机(处理提交时)。
游离状态(Detached)
处于持久状态的对象,脱离于其关系的Session的管理后,对象处于游离状态,处于这种状态,Hibernate无法保证对象所包含的数据库的记录一致,因为Hibernate
已经不能做任何操作。Session提供了两个方法(update()merge())。
1.瞬时状态转为持久状态
使用Session对象save()或saveOrUpdate()方法保存对象后。
使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。
2.持久状态为瞬时状态
执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时对象没有任何数据库数据关联。
3.持久状态为游离状态
执行了Session对象的evict(),clear()或close()方法,对象由原来的持久化转为游离状态。
4.游离状态转为持久状态
重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对 象游离状态转为持久状态,该对象再次与Session对象相关联。
5.游离状态转为瞬时状态
执行Session对象的delete()方法,对象游离状态转为瞬时状态。
处于瞬时状态或游离状态的对象不在被其他对象引用时,会被Java虚拟机按照垃圾回收机制处理。
脏查询及刷新缓存机制
在Hibernate中,状态前后发生变化的对象,称为脏对象。
当事物提交时,Hibernate会对Session中持久状态的对象进行检测,判断对象的数据是否发生改变,这就称为脏检查。
当Session刷新缓存时,会进行脏检查,即比较Dept对象的当前的值类型的属性复制一份快照。
tx=session.beginTransaction();
//获取部门对象,Dept对象处于持久状态。
Dept dept=(Dept)Session.load(Dept.class,new Byte("11"));
dept.setDname("质管部“);
tx.comit();
刷新缓存机制
1.当应用程序调用Transaction的commit()方法时commit()方法先调用session的刷新缓存方法flush(),然后再向数据库提交事务。
2.当应用程序显示调用Session的flush()方法时,刷新缓存。
Session的flush()方法和Transaction的commit()方法区别:flush()方法进行刷新缓存操作,执行一系列的sql语句,但不会提交事务;commit()方法先调用flush()方法,然后提交事务。
提交事务意味着对数据库 所做的更新被永久保存下来。