Session的缓存与对象

Session的缓存

Java对象的生命周期

如果希望一个Java对象一直处于生命周期中,就必须保证至少有一个变量引用它,或者在一个Java集合中存放了这个对象的引用。

Session的缓存

  • Session对象中维护的缓存即称为Hibernate的一级缓存(first cache)

  • 在Session接口的实现类中定义了一系列的Java集合,这些Java集合构成了Session的缓存

  • Session中的缓存中存放着一系列的持久化对象。

  • Hibernate一级缓存

Hibernate一级缓存.PNG

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)方法能够从缓存中删除一个持久化对象,使它变为游离状态。

猜你喜欢

转载自blog.csdn.net/sinat_37976731/article/details/80663686