hibernate之持久化生命周期
来源:互联网 发布:谋略方面书 知乎 编辑:程序博客网 时间:2024/05/03 11:40
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才会从结果集中读取剩下的数据。持久化上下文高速缓存带来重大的性能好处,并改进工作单元中的孤立保证(免费得到了实体实例的可重复读取)。持久化上下文高速缓存有时候帮助避免不必要的数据库流量。
- hibernate之持久化生命周期
- hibernate持久化生命周期
- hibernate持久化生命周期
- Hibernate 实体持久化生命周期状态
- 4.1 持久化生命周期
- hibernate的三种持久化生命周期
- Hibernate持久化生命周期——三态
- Session缓存和持久化生命周期
- 004——session的持久化生命周期
- Session 缓存和持久化生命周期以及Session 基本操作3
- 关于组件实例化生命周期
- Flex 组件实例化生命周期
- Flex Component instantiation life cycle | Flex组件实例化生命周期
- Hibernate之持久化状态
- Hibernate之持久化对象
- hibernate之模拟Hibernate持久化操作
- Java对象持久化技术之Hibernate
- Java对象持久化技术之Hibernate
- 简说LINUX 下chmod chown chgrp和用法和区别
- GEF Note
- 记不住ASP.NET页面生命周期的苦恼(转)
- rails 不是内部或外部命令 的另一个原因
- 现在及将来的发展路线
- hibernate之持久化生命周期
- USB入门系列之二:USB的连接模型
- 读王垠的《完全用Linux工作》
- linux crontab命令 定时重启apache和mysql 相当实用
- 今天开通博客 这是第一篇文章
- USB开发基础:USB命令(请求)和USB描述符
- C# 打印小票 POS
- LabelValueBean
- C++虚函数和纯虚函数区别