Hibernate总结——持久化对象

作者:李东龙

       数据持久化:就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。


       在上篇博客中就写到的该内容,http://blog.csdn.net/lidonglong121/article/details/8669975。本篇博客要从Hibernate实现数据持久化的实现上做一下分析。

 

       咱们先来看看下面这张图吧:

 

       在这张图中同展现了三个数据状态和一些数据处理。

       三种状态有:临时状态(Transient)、持久化状态(Persist)、离线状态(Detached),因为Hibernate是以面向对象的方式对数据进行持久化的,所以又有如下三种对象的概念:临时对象(TransientObjects)、持久化对象(Persist Objects)、离线对象(Detached Objects)。

      

        我们来很简单的认识一下这三种状态,首先这三种状态都是对于Hibernate或者说是对Session而言的。

        临时状态(Transient):使用new操作符初始化的对象。他们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),他们的状态将会丢失,并由垃圾回收机制回收。

        持久化状态(Persist):持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的———他们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQLINSERT,UPDATEDELETE语句把内存中的状态同步到数据库中。

        离线状态(Detached):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。

        

        Hibernate中通过那些操作会出现如上的三种状态呢?其实在图中已经表现的非常清晰了:

 

       临时对象(Transient Objects):

(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。

(2) Sessiondelete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。


        持久化对象(Persist Objects):

(1) Sessionsave()方法把临时对象转变为持久化对象。

(2) Sessionload()get()方法返回的对象总是处于持久化状态。

(3) Sessionfind()方法返回的List集合中存放的都是持久化对象。

(4) Sessionupdate()saveOrUpdate()lock()方法使游离对象转变为持久化对象。

(5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。


         离线对象(Detached Objects):

         游离对象与临时对象的相同之处在于,两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。
        Session
的以下方法使持久化对象转变为游离对象:

(1) 当调用Sessionclose()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。

(2)Sessionevict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当Session的缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。但是多数情况下不推荐使用evict()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度。

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值