对象的三种状态
对于Hibernate而言,对象状态分为三种:
瞬时态
当对象刚创建,和Session没有发生任何关系时,当程序运行完成就立刻消失,被称为瞬时态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session可以将其变成持久化状态。具体的转化方法如下:
Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。
void persist(Object obj):将object对象转化为持久化状态,该对象的属性将被保存到数据库中。
Serializable save(Object obj,Ojbect pk):将obj对象保存到数据库,保存到数据库时,指定主键值。
void persist(Object obj,Object pk):将obj对象转化为持久化状态,该对象保存到数据库,指定主键值。
持久态
当执行如下代码是,对象变为持久态
Emp e = new Emp();
session.save();
持久态的对象和Session发生了关系,如执行了save、get、query等方法
- Session中会缓存该对象(Session的缓存叫一级缓存)
- Session在获取对象是,首先去查找一级缓存,如果没有才查询数据库。
- Session要负责将持久态对象的变化更新到数据库。(在是flush()的时候更新,tx在提交的时候会自动调用session的flush())。
游离态
Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。
游离对象的特征。游离对象具有以下特征:
1、不再位于Session的缓存中,也可以说,游离对象不被Session关联。
2、游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。
游离对象与临时对象的相同之处在于,两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。
Session的以下方法使持久化对象转变为游离对象:
1、当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
2、Session的evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当Session的缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。但是多数情况下不推荐使用evict()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度。