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
一.持久化对象的状态
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
相关文章推荐
- Hibernate Session 事务隔离级别回顾 持久化对象的状态 Session核心方法
- Hibernate持久化对象状态 Session缓存(一级缓存),快照 操纵持久化对象的方法
- Hibernate之Session对象的相关方法以及持久化对象的状态
- Hibernate学习笔记(四)----核心开发接口、对象的三种状态、session常用方法
- Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征
- Hibernate之Session对象的相关方法以及持久化对象的状态
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- Hibernate的持久化对象状态的方法
- hibernate的持久化对象的状态,n+1问题和load和get方法区别
- 5.5 深入理解持久化对象:(5.5.3)改变持久化对象状态的方法
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- 【Hibernate】持久化对象的状态的变化和对应的方法
- 03-Hibernate入门Session的重要方法对象状态
- 【Hibernate框架开发之五】Hibernate对象的三种状态&&Session的常用方法
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- 持久化对象三种状态以及session的Get()与Load()区别
- hibernate常用的接口和类的方法以及持久化对象的状态变化
- 对象的三种状态(hibernate的session的get和load方法的区别,session的常用方法,session缓存)
- 【Hibernate框架开发之五】Hibernate对象的三种状态&Session常用方法
- 新手上路之Hibernate(三):持久化对象三种状态以及session的Get()与Load()区别