Hibernate中的Java对象在他的生命周期中,可处于以下四个状态之一。
1.临时状态(Transient):刚用new语句创建,还没有被持久化,并且不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
2.持久化状态(persistent):已经被持久化,并且加入到Session缓存中。处于持久化状态的Java对象被称为持久化对象。
3.删除状态(removed):不再处于Session的缓存中,并且Session已经计划将其从数据库中删除。处于删除状态的Java对象被称为被删除对象。
4.游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离态的Java对象被称为游离对象。
临时对象的特征:
1.在使用代理主键的情况下,OID通常为NULL。
2.不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
3.在数据库中没有对应的记录。
在以下情况下,Java对象进入临时状态。
1.当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
2.在Hibernate的配置文件中的hibernate.use_identifier_roll_backz属性为true的情况下,Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。
持久化对象的特征:
1.OID不为null。
2.位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。
3.持久化对象和数据库中的相关记录对应。
4.Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
Session的许多方法都能够使Java对象转变为持久化对象:
1.Session的save()方法把临时对象转变为持久化对象。
2.Session的load()方法或get()方法返回的对象总是处于持久化状态。
3.Query的list()方法返回的List集合中存放的都是持久化对象。
4.Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
5.当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。
被删除对象的特征:
1.OID不为null。
2.从一个Session实例的缓存中删除。
3.被删除对象和数据库中的相关记录对应。
4.Session已经计划将其从数据库中删除。
5.Session在清理缓存时,会执行SQL delete语句,删除数据库中的相应记录。
6.一般情况下,应用程序不应该再使用被删除的对象。
在以下情况下,Java对象会进入删除状态:
1.在Hibernate的配置文件中的hibernate.use_identifier_rollback属性去默认值false的情况下,Session的delete()方法把持久化对象及游离对象转变为被删除对象。
2.当一个持久化对象A关联一个持久化对象,在允许级联删除的情况下,Session删除持久化对象A时,会级联删除持久化对象B,使得持久化对象A和持久化对象B都进入删除状态。
游离对象的特征:
1.OID不为null。
2.不再位于Session的缓存中,也可以说,游离对象不被Session关联。
3.游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录。
Session的以下方法使持久化对象转变为游离对象。
1.当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
2.Session的evict()方法能够从缓存中清除一个持久化对象,使它变为游离对象。当Session的缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中清楚一些持久化对象。但是在多数情况下不推荐使用evict()方法,而应该通过查询语言或者显示的导航来控制对象图的深度。
3.Session的clear()方法能够清除缓存中的所有持久化对象,使他们变为游离对象。
网友评论