Hibernate 把对象分为 4 种状态: 持久化状态、临时状态、游离状态、 删除状态.。Session 的特定方法能使对象从一个状态转换到另一个状态.。
- 临时对象(Transient):
- 在使用代理主键的情况下, OID 通常为 null
- 不处于 Session 的缓存中
- 在数据库中没有对应的记录
- 持久化对象(也叫”托管”)(Persist):
- OID 不为 null
- 位于 Session 缓存中
- 若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
- Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
- 在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象
- 删除对象(Removed)
- 在数据库中没有和其 OID 对应的记录
- 不再处于 Session 缓存中
- 一般情况下, 应用程序不该再使用被删除的对象
- 游离对象(也叫”脱管”) (Detached):
- OID 不为 null
- 不再处于 Session 缓存中
- 一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录
对象的状态转换图
接下里就是我们session的一些方法了
save:使一个临时对象转变为持久化对象,为持久化对象分配唯一的 OID,执行一条 insert 语句:在 flush 缓存的时候,在save方法之前设置的id无效,之后设置的id不能被修改(设置id 的话我这里注释了,自己可以去试下结果)
这里我附上图:
persist与save的区别:设置id的话,执行 persist() 方法时会抛出一个异常。这里我就不附图了,自己可以去看看
get:会立即加载对象(立即检索)如图:
若数据表没有对应的记录,则显示null(自己要去尝试下,这里我就不附图了)
load与get的区别:若不使用该对象,则不会立即执行查询操作,而返回一个代理对象(延迟检索)如图:
若数据表没有对应的记录,则会抛出异常
在需要初始化,代理对象之前已经关闭了 Session,load 方法可能会抛出 LazyInitializationException 异常 如图:(这里我关闭的是我注释的地方)
还有一些方法,等我学习完了再写。
Hibernate中session核心方法详解(二)链接: