hibernate之持久化生命周期

本文解析了Hibernate中对象的四种状态:瞬时、持久化、移除和脱管状态,并介绍了持久化上下文的作用及其带来的自动脏检查和缓存优势。

hibernate之持久化生命周期


我们这里所谓的持久化生命周期指的是对象在它的生命期间经历的状态。hibernate定义4种对象状态:瞬时状态,持久化状态,移除状态,脱管状态。我们也使用术语:工作单元,指的是把一组操作当作一个(通常是原子的)组。另一个难题是由持久化服务提供的持久化上下文,把持久化上下文当作高速缓存,它记住你在一个特定的工作单元中给对象所做的所有修改和状态改变。下面我们来剖析一下术语:对象状态和持久化上下文。

----------

对象状态

 

瞬时对象:利用new操作符实例化的对象并不立即就是持久化的。它们的状态是瞬时的,意味着它们不与任何数据库表行相关联,因此一旦不再被其他的对象引用时,它们的状态立即丢失。对于从瞬时转变为持久化状态的实例,需要调用一个持久化管理器。

 

持久化对象:持久化实例是一个包含数据库同一性的实体实例,这意味着持久化且被托管的实例具有设置成为其数据库标识符的主键值。从瞬时对象变成持久化对象可以调用这些方法,如:save(),saveOrUpdate(),persist(),merge()。

 

移除对象:如果一个对象已经被计划在一个工作单元结束时删除,它就是处于移除状态,但仍然由持久化上下文托管,直到工作单元完成。一旦工作单元完成,它就将立即从数据库中被删除。对象变成移除状态可以调用,如:delete(),remove().

 

脱管对象:工作单元完成了,持久化上下文也关闭了。但是应用程序仍然有一个句柄:对被保存实例的一个引用。只要持久化上下文是活动的,这个实例的状态就是持久化的。在工作单元结束时,持久化上下文关闭后,这些对象当作脱管,表示它们的状态不再保证与数据库状态同步,不再被附加到持久化上下文中。从持久对象变成脱管对象可以调用这样的方法,如:evict(),close(),clear()。

----------

关于持久化上下文

 

持久化上下文的作用:

1. hibernate可以进行自动的脏检查和事务迟写。

2. hibernate可以用持久化上下文作为一级高速缓存。

3. hibernate可以保证java对象同一性的范围。

4. hibernate可以把持久化上下文扩展到跨整个对象。

 

自动脏检查

持久化实例托管在一个持久化上下文中---它们的状态在工作单元结束时与数据库同步。当一个工作单元结束时,保存在内存中的状态通过sql insert,update和delete语句(DML)的执行被传播到数据库。ORM软件必须有一个策略,用来侦测哪个持久化对象已经被应用程序修改。我们称之为自动脏检查。一个修改过的对象还没有被传播到数据库时被认为是脏的。利用透明的事务级迟写,hibernate尽可能迟地把状态变化传播到数据库,hibernate试图保证数据库中的锁时间尽可能短。

 

持久化上下文高速缓存                            

持久化上下文是持久化实体实例的一个高速缓存。这意味着它记住了你已经在特定的工作单元中处理过的所有持久化实体实例。自动脏检查是这个高速缓存的好处之一。另一个好处是对实体的可重复读取,以及工作单元范围高速缓存的性能优势。例如,如果hibernate被告知通过主键加载对象,它就可以先在当前的工作单元的持久化上下文中检查。如果在那里找到实体,就不会发生数据库命中---这是对应用程序的可重复读取。在当前的持久化上下文中无法找到该实体时,hibernate才会从结果集中读取剩下的数据。持久化上下文高速缓存带来重大的性能好处,并改进工作单元中的孤立保证(免费得到了实体实例的可重复读取)。持久化上下文高速缓存有时候帮助避免不必要的数据库流量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值