Day 18 Session核心方法(持久化对象的状态)

来源:互联网 发布:java中prototype 编辑:程序博客网 时间:2024/06/07 14:57

站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态. 

一.持久化对象的状态

1.临时对象(Transient): 
   在使用代理主键的情况下, OID 通常为 null
   不处于 Session 的缓存中
   在数据库中没有对应的记录
2.持久化对象(也叫”托管”)(Persist):
   OID 不为 null
   位于 Session 缓存中
   若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
   Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
   在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象

3.删除对象(Removed)
   在数据库中没有和其 OID 对应的记录
   不再处于 Session 缓存中
   一般情况下, 应用程序不该再使用被删除的对象

4.游离对象(也叫”脱管”) (Detached):
   OID 不为 null
   不再处于 Session 缓存中
   一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录

二.

1.Session 的 save() 方法:使一个临时对象转变为持久化对象

  Session 的 save() 方法完成以下操作:
   1)把 News 对象加入到 Session 缓存中, 使它进入持久化状态
   2)选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在 使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
   3)计划执行一条 insert 语句:在 flush 缓存的时候

   4)当 News 对象处于持久化之前的ID是无效的,处于持久化状态时, 不允许程序随意修改它的 ID



2.persist() 方法:和save()方法都可以完成一个insert操作

1)persist() 和 save() 区别:在persist()方法之前,若对象已经有ID,则不会执行insert,而抛出异常



3.Session 的 get() 和 load() 方法:都可以根据跟定的 OID 从数据库中加载一个持久化对象

区别:

>执行get方法立即加载对象(l立即检索)

  而执行load方法,若不适用该对象,则不会立即执行查询操作,而返回一个代理对象(延迟检索)

>若表中没有对应的记录,get返回null,load抛出异常

>当数据库中不存在与 ID 对应的记录时, load() 方法抛出 ObjectNotFoundException 异常, 而 get() 方法返回 null

>load方法可能会抛出LazyInitializationException异常:在需要出示化代理对象之前已经关闭了Session



0 0