hibernate对象的三种状态转换关系图
三种状态
瞬时状态(transient):
通过new创建对象后,对象并没有立刻持久化, 它并未参与数据库中的数据有任何的关联,此时java对象的状态为瞬时状态。session对瞬时状态的对象一无所知,当对象不再被引用时,她的数据也就丢失了, 对象将会被java虚拟机按照垃圾回收机制处理。
持久状态(persistent):
当对象与session关联,被session管理时,它就处于持久化状态。处于持久状态的对象拥有数据库的标志。对象什么时候与session建立联系的?
(1)通过session查询的接口,或者get,或者load方法从数据库中加载对象的时候
(2)瞬时状态的对象,通过调用save或者saveorupdate方法时处于持久状态的对象,session会持续跟踪和管理他们,如果对象的内部状态发生了任何更改,hibernate会选择合适的时机(如事务提交时)将变更固化到数据库中。
游离状态(Detached):
处于持久状态的对象,脱离与其session 的管理后,对象就处于游离状态。 执行session的evict,clear,close()方法后,可以将持久状态变为游离状态
session提供了两个方法(update,merge)将处于游离状态的对象,与一个新的session关联,此时对象的状态就重新变回持久状态。
状态转换:
1.瞬时状态转换为持久状态
使用session的save()或者saveorupdate()方法保存对象后,变为持久状态
使用session对象的get或者load方法获取对象,,该对象的状态是持久状态。
2.持久状态转为瞬时状态
执行session的delete()后,变为瞬时状态
3.持久状态转换为游离状态
执行了session的evict(),clear()或者close()方法后
4.游离状态转为持久状态
重新获取session对象,执行session对象的update或者saveorupdate()后,变为持久状态
5.游离状态转为瞬时状态
执行session的delete()后,对象有游离状态转为瞬时状态。
状态前后发生变化的对象称为脏对象
脏检查: 提交事务的时候,hibernate会对session中持久状态的对象检查,看数据是否发生了变化
目的: 保证内存中的数据对象和数据库表的数据一致
刷新缓存机制:
1.执行事务的commit方法的时候,可以刷新缓存
2. 执行session.flush()方法