瞬时状态
瞬时状态又称临时状态.如果java对象与数据库中的数据没有任何的关联,即此java对象在数据库中没有相关联的记录,此时java对象的状态为瞬时状态,session对于
瞬时状态的ava对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被java虚拟机按照垃圾回收处理
持久状态
当对象与session关联,被session管理时,它就处于持久状态.处于直接状态的对象拥有数据库标识符(数据库中主键的值).那么,对象是什么时候与session发生关联呢?
通过session查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的session发生关联,
对瞬时状态的对象调用session的save(),saveOrUpdate()等方法时,在保存对象数据的同事,java对象的内部状态发生了任何变更,hibernate会选择合适的时间(如事务提交时)将变成同步到数据库中
游离状态
游离状态又称托管状态,处于持久状态的对象,脱离与其关联的session的管理后,对象就处于游离状态.处于游离状态的对象,hibernate无法保证对象所包含的数与数据
库中的记录一致,因为hibernate以及无法感知对该对象的任何操作.session提供了update(),saveOrupdate()等方法,将处于游离状态的对象数以更新的方式同步到数据库中
,并将该对象与当前的session关联.这时,对的状态就从游离状态重新转换为持久状态
三种状态之间的转换
瞬时转持久
使用session的save(),saveOrUpdate()等方法保存对象后,该对象的状态由谁是状态转换为持久状态
使用session的get()或load()方法获取对象,该对象的状态是持久状态
持久转瞬时
执行session的delete()方法后,对象由原来的持久状态变为瞬时,因为此时该对象没有与任何数据库关联
持久转游离
执行session的evict(),clear()或close()方法,对象由原来的持久状态转为游离
游离转持久
执行session的update()或saveOrUpdate()方法,对象由游离转为持久,该对象再次与当前session相关联
游离转瞬时
1.执行session的delete方法,对象由游离转为瞬时
注意:处于瞬时或游离的对象不再被其他对象引用时,会被JVM按照垃圾回收机制处理
脏检查
在hibernate中,数据前后发生变化的对象,称为脏对象.
tx=HibernateUtil.currentSession().beginTransaction();//获取员工对象,此时对象处于持久状态
Emp empUpdate = empDao.update(7900);//修改后,信息和之前不同,此时 empUpdate对象成为"脏对象"
empUpdate.setSal(6666);//提交事务
tx.commit();
以上代码中empUpdate对象处于持久状态,当对象被加入session缓存中时,session会为对象复制一份快照,如果快照的属性发生改变即成为脏对象.
在事务提交时,hibernate会对session中持久化的对象进行检查,即比较对象当前属性与它的快照,以判断属性是否发生变化,这种判断成为脏检查.如
发生改变session会使用最新的属性值来执行相关的SQL语句,将变化保存确保数据库和对象数据的数据一致
刷新缓存机制
当session缓存中对象的属性发生变化时,session并不会立即执行脏检查和相关的SQL语句,而是在特定的时间,即刷新缓存时才执行.使得session
能够把多次变化合并为一条或者一批SQL语句,减少访问次数提高程序的数据访问性能.
在默认情况下,session会在以下时间点刷新缓存
应用程序显示调用session的flush()方法
session的flush()方法进行刷新缓存的操作,会触发脏检查,从而执行相关的SQL语句
应用程序调用事务的 commit()方法时
commit()方法会先调用session的刷新缓存的方法flush(),然后向数据库提交事务