Hibernate(三)---通过Session操纵持久化对象

(一)Session概述
· Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应.
· 站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态.
(二)操作Session缓存
(1)flush缓存
flush: 使数据表中的记录和 Session 缓存中的对象的状态保持一致. 为了保持一致, 则可能会发送对应的 SQL 语句.
* 1. 在 Transaction 的 commit() 方法中: 先调用 session 的 flush 方法, 再提交事务
* 2. flush() 方法会可能会发送 SQL 语句, 但不会提交事务.
* 3. 注意: 在未提交事务或显式的调用 session.flush() 方法之前, 也有可能会进行 flush() 操作.
1). 执行 HQL 或 QBC 查询, 会先进行 flush() 操作, 以得到数据表的最新的记录
2). 若记录的 ID 是由底层数据库使用自增的方式生成的, 则在调用 save() 方法时, 就会立即发送 INSERT 语句.
* 因为 save 方法后, 必须保证对象的 ID 是存在的.
(2)refresh():会强制发送SELECT语句,以使Session缓存中对象的状态和数据表中对应的记录保存一致.
(3)clear():清理缓存.
(三)持久化对象的状态
这里写图片描述
*临时对象(Transient):

  • 在使用代理主键的情况下, OID 通常为 null
  • 不处于 Session 的缓存中
  • 在数据库中没有对应的记录

*持久化对象(也叫”托管”)(Persist):

  • OID 不为 null
  • 位于 Session 缓存中
  • 若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
  • Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
  • 在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象

*删除对象(Removed):

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

*游离对象(也叫”脱管”) (Detached):

  • OID 不为 null
  • 不再处于 Session 缓存中
  • 一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录

~. save() 方法
* 1). 使一个临时对象变为持久化对象
* 2). 为对象分配 ID.
* 3). 在 flush 缓存时会发送一条 INSERT 语句.
* 4). 在 save 方法之前的 id 是无效的
* 5). 持久化对象的 ID 是不能被修改的

~persist(): 也会执行 INSERT 操作
注:persist()和 save() 的区别 : 在调用 persist 方法之前, 若对象已经有 id 了, 则不会执行 INSERT, 而抛出异常.
~get VS load:

TablesAre
执行 get 方法: 会立即加载对象.执行 load 方法, 若不适用该对象, 则不会立即执行查询操作, 而返回一个代理对象
get 是 立即检索load 是延迟检索
不会抛出异常load 方法可能会抛出 LazyInitializationException 异常: 在需要初始化代理对象之前已经关闭了 Session
若数据表中没有对应的记录, Session 也没有被关闭: get 返回 null若数据表中没有对应的记录, Session 也没有被关闭:load 若不使用该对象的任何属性, 没问题; 若需要初始化了, 抛出异常.

~update:
update:
* 1. 若更新一个持久化对象, 不需要显示的调用 update 方法. 因为在调用 Transaction
* 的 commit() 方法时, 会先执行 session 的 flush 方法.
* 2. 更新一个游离对象, 需要显式的调用 session 的 update 方法. 可以把一个游离对象
* 变为持久化对象
*
* 需要注意的:
* 1. 无论要更新的游离对象和数据表的记录是否一致, 都会发送 UPDATE 语句.
* 如何能让 updat 方法不再盲目的出发 update 语句呢 ? 在 .hbm.xml 文件的 class 节点设置
* select-before-update=true (默认为 false). 但通常不需要设置该属性.
*
* 2. 若数据表中没有对应的记录, 但还调用了 update 方法, 会抛出异常
*
* 3. 当 update() 方法关联一个游离对象时,
* 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常. 因为在 Session 缓存中
* 不能有两个 OID 相同的对象!
~saveOrUpdate
①同时包含了save和update的功能;
②若OID不为null,但数据库中还没有和其对应的记录,会抛出一个异常;
③若OID的值等于hibernate配置文件中ID节点的unsaved-value属性值对象时,也被认为是一个游离对象;
~delete
①执行删除操作;
②只要 OID 和数据表中一条记录对应, 就会准备执行 delete 操作,若 OID 在数据表中没有对应的记录, 则抛出异常;
③可以通过设置 hibernate 配置文件 hibernate.use_identifier_rollback 为 true,使删除对象后, 把其 OID 置为 null ;
~evict: 从 session 缓存中把指定的持久化对象移除;
(四)通过hibernate调用存储过程
· Work 接口: 直接通过 JDBC API 来访问数据库的操作;
· Session 的 doWork(Work) 方法用于执行 Work 对象指定的操作, 即调用 Work 对象的 execute() 方法. Session 会把当前使用的数据库连接传递给 execute() 方法;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值