您的位置:首页 > 其它

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

2017-02-19 13:41 232 查看
站在持久化的角度, 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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐