瞬时状态
瞬时状态又称临时状态.如果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会为对象的值类型的属性复制一份快照
刷新缓存机制
扫描二维码关注公众号,回复:
4142888 查看本文章