Hibernate 是一种透明的持久化机制
类不知道它们自己的持久化能力,
持久化生命周期
指的是对象在他的生命周期经历的状态
工作单元
把一组操作当作一个原子组
对象的状态
瞬时对象
利用new 操作符实例化的对象并不立即持久化的,
它们的状态是瞬时的transient
意味着不与任何数据库表关联
一旦不再被其他的对象引用,状态立即丢失
非事务的,没有回滚的功能
持久化对象
数据库中存在同一性的实体实例
意味着持久化且被托管的实例具有设置成其数据库标识符的主键值
持久化对象始终与持久化上下文persistance context 关联
高速缓存它们,并且可以侦测到它们是否已经修改
移除对象
立即从数据库中被删除
托管对象
detached
持久化之后,上下文关闭了,应用程序中保存该对象的句柄handle
它们饿状态不再保证与数据库状态同步
不再被附加到持久化上下文中
可以使用reattachment 和merging两种操作来处理这种情况
持久化上下文
可以认为持久化上下文是托管实体实例的一个高速缓存
EntityManager具有持久化上下文。
一个工作单元中所有处于持久化状态和托管状态的实例都被高速缓存在这个上下文中
- 可以进行自动的脏检查和事务迟写
一个修改过的对象还没有被传播到数据库时被认为是脏数据
利用透明的事务级迟写,可以尽可能的把状态变化传播到数据库 - 可以用持久化上下文作为一级高速缓存
可重复读取,如果命中就不回查数据库 - 保证java对象同一性的范围
- 可以把持久化上下文扩展到跨整个对话
hibernate可以支持一个可能长期运行的工作单元,称作对话,conversation的实现
对象同一性范围
没有同一性范围的基本持久层不保证一个行是否被访问两次,以及是否会把相同的对象实例返回给应用程序
保证在单个持久化上下文范围中,只有一个对象实例表示一个特定的数据库行
过程范围的同一性,保证整个过程jvm中只有一个对象实例表示该行