Session的缓存
Java对象的生命周期
如果希望一个Java对象一直处于生命周期中,就必须保证至少有一个变量引用它,或者在一个Java集合中存放了这个对象的引用。
Session的缓存
Session对象中维护的缓存即称为Hibernate的一级缓存(first cache)
在Session接口的实现类中定义了一系列的Java集合,这些Java集合构成了Session的缓存
Session中的缓存中存放着一系列的持久化对象。
Hibernate一级缓存
Hibernate对象的三种状态
临时状态/临界状态/瞬时状态(transient)
刚刚使用 new 语句创建对象,还没有被持久化,不处于Session缓存中,处于临时状态的Java对象也被称为临时对象。
特征
不处于Session缓存中,也可以说,不被任何一个Session对象关联
在数据库中没有对应的记录
持久化状态/受管状态(presistent)
对象已经被持久化,并加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象
特征
被一个Session对象关联
持久化对象和数据库中的相应记录对应
Session在清理缓存时会根据持久化对象的属性变化来同步更新数据库
游离状态(detached)
对象已经被持久化,但是不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
特征
不再位于Session缓存中,也可以说,游离对象不被Session关联
游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录(前提是没有其他程序删除了这条记录)
游离对象与临时对象的相同之处在于,两者不被Session关联,因此Hibernate不会保证它们的属性发生变化与数据库同步
游离对象与临时对象的区别之处在于,前者是由持久化对象转变过来 的,因此可能还在数据库中存在着对应的记录,而后者没有。
Hibernate对象的比较
是否与Session关联 | 数据库表中是否有对应的记录 |
---|---|
临时对象 | 不关联 |
游离对象 | 不关联 |
持久化对象 | 关联 |
Hibernate对象的转换
对象状态转换的注意点
Session的delete()方法能使一个持久化对象或者游离对象转变为临时对象。对于游离对象,delete() 方法从数据库中删除与它对应的记录,对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中也删除。
当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也变为持久化对象。
Hibernate保证在同一个Session对象的缓存中,数据库表中的每条记录只对应唯一的持久化对象。
当update()方法关联一个游离对象时,如果在Session缓存中已经存在相同的OID的持久化对象,就会抛出异常。
当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
Session的evict(Object o)方法能够从缓存中删除一个持久化对象,使它变为游离状态。