Hibernate持久化类中对象的3种状态


Hibernate中,持久化类的实例对象的种类以及对应的状态---可以分为3类:

瞬时对象(Transient Objects):处于临时状态的对象属于瞬时对象---对应 瞬态(Transient)

java对象何时会进入临时状态?
(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。

持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例----持久态(Persistent)当事务提交时,通过执行SQL的INSERT,UPDATE和DELETE语句把内存中的状态同步到数据库中。

java对象何时会进入持久化状态?

(1) Session的save()方法把临时对象转变为持久化对象。
(2) Session的load()或get()方法返回的对象总是处于持久化状态。
(3) Session的find()方法返回的List集合中存放的都是持久化对象。
(4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
(5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。


离线对象(Detached Objects),也叫脱管(detached)状态Session关闭之后,持久化对象就变为离线对象。

java对象何时会进入游离状态?

(1) 当调用Session的close()方法时,Session的缓存被清空。如果在应用程序中没有引用变量引用这些游离对象,它们就会被回收,结束生命周期。
(2)Session的evict()方法时。evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态,降低内存消耗。

(但是多数情况下不推荐使用evict()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度。)


请注意,离线对象不是瞬时对象,区别:

1、相同点:离线对象和瞬时对象都与session没有关联。

2、不同点:离线对象和数据库记录存在关联,可以通过lock()/updateOrSave等方法变为持久化状态。但是后者与任何数据都无关。


 持久化对象的生命周期可以通过它们之间的状态转化关系理解:


                                        




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值