HIbernate逍遥游记——(三)通过Hibernate操纵对象

1 理解Session缓存

  •   持久化对象: Session缓存中的对象。
  •   Hibernate中对象的4种状态:持久化状态、临时状态、游离状态、删除状态。

Session缓存中的对象的生命周期依赖于Session实例。如图6-1所示:

图6-1 Session缓存中的对象的生命周期依赖于Session实例

1.1 Session缓存的作用

  1. 减少访问数据的频率。如果要找的对象在Session缓存中那么直接返回该对象的引用,而不必查找数据库了。
  2. 当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。(这个暂时我不理解!!)
  3. 保证数据库中的相关记录与缓存中的相应对象(持久化的对象)保持同步。图6-2显示了映射机制:

图6-2 静态映射与动态映射


1.2 脏检查及清理缓存机制

  • 脏检查:比较持久化对象的当前属性与他的快照的属性,从而判断持久化对象的属性是否发生变化的过程。

当从数据库加载一个对象到Session缓存中时,Session会为该对象的值类型属性复制一份快照。当Session清理缓存时,进行脏检查,并根据脏对象的最新属性来执行相应 的SQL语句,从而同步更新数据库。不是每次对象属性发生变化时就立即清理缓存,而是在特定的时间点,可以减少访问数据库的次数。

  • 清理缓存的时间点:
  1. 调用org.hibernate.Transaction的commint(),先清理缓存,再提交事务;(好处:减少访问数据库频率同时缩短当前事务对数据库相关资源的锁定时间)
  2. 执行某些查询操作;(Session缓存与数据库尽心同步)
  3. 调用Session的flush()方法。(只清理缓存)

2 Java对象在Hibernate持久层的状态

  • 临时状态:刚使用new()创建且不再Session缓存中;
  • 持久化状态:被持久化(对象信息以记录的形式保存到数据库中)且加入到Session缓存中;
  • 删除状态:不再处于Session缓存中,且Session已经计划将其从数据库中删除;
  • 游离状态:已经被持久化但不在Session的缓存中。

如图6-3显示了临时状态、持久化状态、删除状态及游离状态的转换:

图6-3 对象在Hibernate持久化层的状态转换图

四种状态下的对象特征从三个方面考察:

  • 对象的OID是否为null;
  • 对象是否处在Session缓存中,也就是是否与Session关联;
  • 数据库中是否存在对应的记录。

3 Session接口

  • save() ——将一个临时对象变为持久化对象。注意:不要使用该方法保存游离对象;
  • load()和get()——用给定的OID加载对象时,数据库中不存在与OID对应的记录时,load抛出没有找到对象异常,而get返回null;load()默认使用延迟检索,而get总是使用立即检索。
  • update()——将一个游离对象转变为持久化对象,且在清理缓存时执行update语句。注意:当该方法关联一个游离对象时,如果在Session缓存中存在一个同类型并且OID相同的持久化对象时,update()会抛出NonUniqueException异常。
  • saveOrUpdate()——包含save和update功能
  • merge()——把一个游离对象的属性复制到一个持久化对象中。
  • delete()——删除持久化对象时直接计划执行一个delete语句;而删除游离对象时先将该对象与Session关联然后再计划执行delete语句。

4 级联操纵对象

映射持久化类之间关联关系的元素<set>、<many-to-many>、<one-to-one>的cascade属性用于指定如何操纵与当前对象关联的其他对象。图6-4列出cascade属性的可选值:

图6-5 cascade属性描述

5 批量处理数据

批处理:在一个事务中处理大量的数据。

应用程序中批量操作的方式(尽量避免):

  • 通过Session
  • 通过StatelessSession
  • 通过HQL

6 Hibernate的二级缓存结构

Hibernate的二级缓存结构如图6-6所示:

图6-6 HIbernate的二级缓存结构

第一级缓存:Session缓存。Session对象的生命周期通常对应一个数据库事务或一个应用事务。

第二级缓存:可插拔的缓存插件,有SessionFactoty负责管理。SessionFactory对象的生命周期对应应用程序进程的整个进程。默认不启动。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值