笑着生活  
思想大于技术...... 惟仁者为能以大事小,惟智者为能以小事大: Java之路——专注,研究,思考,总结
日历
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 46
  • 文章 - 4
  • 评论 - 4
  • 引用 - 0

导航

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
Hibernate中的实体物件可以分为四种状态:Transient、 Persistent、DetachedRemoved
  • Transient
当您直接使用new创建出物件,例如在之前的例子中, User类别所衍生出之物件,在还没有使用save()之前都是Transient物件,这些物件还没有与资料库发生任何的关系,不对应于资料库中的任一笔资料。

  • Persistent
当物件与资料库中的资料有对应关系,并且与Session 实例有关联而Session 实例尚未关闭(close),则它是在Persistent状态,具体而言,如果您将Transient状态的物件使用Session的save()方法加以储存,或是使用Hibernate从资料库载入资料并封装为物件(例如使用get()、load()等查询物件的相关方法),则该物件为Persistent状态。

Persistent状态的物件对应于资料库中的一笔资料,物件的id值与资料的主键值相同,并且Session实例尚未失效,在这期间您对物件的任何状态变动,在Session实例关闭(close)或Transaction实例执行commit()之后,资料库中对应的资料也会跟着更新。

如果您将Session实例关闭(close),则Persistent状态的物件会成为Detached状态。

如果您使用Session的实例delete()方法删除资料,Persistent状态的物件由于失去了对应的资料,则它会成为Transient状态。
  • Detached
Detached状态的物件,其id与资料库的主键值对应,但脱离Session实例的管理,例如在使用load()方法查询到资料并封装为物件之后,将Session实例关闭,则物件由Persistent状态变为Detached状态,Detached状态的物件之任何属性变动,不会对资料库中的资料造成任何的影响。

Detached状态的物件可以使用update()方法使之与资料库中的对应资料再度发生关联,此时Detached状态的物件会变为 Persistent状态。

Detached物件,若不再被任何名称参考,则在适当的时候将被垃圾收集所回收。

  • Removed
如果您使用Session的实例delete()或remove()方法删除资料,Persistent状态的物件由于失去了对应的资料,则它会成为Removed状态,一个成为Removed状态的物件不应该被继续重用,您应该释放任何参考至它的名称,让该物件在适当的时候被垃圾回收。

简单的说,Transient与Detached状态的物件未受Hibernate持久层管理员管理,对这两个状态的物件作任何属性变动,不会对资料库中的资料有任何的影响,Detached状态物件可以读取数据库数据。而Persistent状态的物件受Hibernate持久层管理,对物件的属性变动,在Session实例关闭(close)或 Transaction实例执行commit()之后,资料库中对应的资料也会跟着更新。

Transient与Detached状态的物件是非管理状态,而Persistent状态的物件是管理状态,又称为Persistent Object,其与一个
Persistence Context 关联。

在物件为Persistent时,如果物件的属性发生变化,并且尚未提交之前,物件所携带的资料称之为Dirty Data,Hibernate会在Persistence Context维护物件的最近读取版本,并在资料提交时检查两个版本的属性是否有变化,如果有的话,则将资料库中的资料进行更新


posted on 2008-10-08 21:32 999 阅读(271) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 999 Powered by: 博客园 模板提供:沪江博客