美文网首页
Java对象在Hibernate持久化层的状态

Java对象在Hibernate持久化层的状态

作者: 跑不完的操场 | 来源:发表于2017-06-16 16:37 被阅读0次

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()方法能够清除缓存中的所有持久化对象,使他们变为游离对象。

相关文章

网友评论

      本文标题:Java对象在Hibernate持久化层的状态

      本文链接:https://www.haomeiwen.com/subject/lwdmqxtx.html