zoukankan      html  css  js  c++  java
  • hibernate框架学习第三天:对象状态、一级缓存、快照等


    对象的状态
    瞬时状态: 瞬时对象(TO)
    应用程序创建出来的对象,不受H3控制
    注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO
    持久化状态:持久化对象(PO)
    受H3控制的对象,PO一定具有OID
    托管状态: 托管对象(DO)
    曾经受到H3控制,当前不受H3控制(Session关闭),一定具有OID
    给TO赋值OID
    TO,PO,DO的区别
    1.受控(Session)
    2.OID
    对象状态对应的时机
    TO
    new创建的对象并且不携带OID
    PO
    save后的对象 update后的对象
    saveOrUpdate后的对象 merge后的对象
    delete后的对象
    load/get等通过查询方法获取到的对象
    Query Criteria读取的数据对应的对象
    DO
    Session关闭后,在此Session操作过程中所有的PO对象
    手工清除session中的某个PO(特殊)
    为TO对象指定OID

    一级缓存
    什么是缓存?数据的临时存储空间,缓存中保存的数据是真实数据的一份拷贝
    H3具有两级缓存
    一级缓存(H3自带)
    二级缓存(外部技术实现)

    一级缓存
    H3内部Session操作的数据就是保存在一级缓存中,无论Session操作多少个对象,都存放在这个空间内
    不同的Session对应存储的区域是不同的区域
    一级缓存的操作
    1.证明一级缓存存在性
    无论进行什么样的操作,只要Session控制过某个对象,该对象就加入一级缓存
    下一次使用直接从一级缓存中获取
    2.get/load区别
    load/get在查询时,首先判断一级缓存中是否存在该数据
    如果存在,直接获取
    如果不存在,执行下面的操作
    get方法获取数据将直接执行SQL语句,从数据库获取,将数据加载到一级缓存
    load方法获取数据,先不执行SQL,创建一个代理对象,只具有OID,并且放入一级缓存
    当开发者只使用OID属性时,不用执行查询
    当开发者使用OID属性之外的属性时,才执行查询
    load方法的延迟加载
    关闭lazy延迟加载功能:
    1.
    2.
    3.
    lazy=false,load方法与get方法基本相同
    3.读取一级缓存,SQL执行后获取数据并加载到一级缓存
    4.修改数据,将要修改的数据放入一级缓存,此时不执行SQL,刷新一级缓存时执行
    5.刷新一级缓存的方式
    执行事务提交
    t.commit();
    刷新Session范围的缓存数据
    s.flush();
    关闭Session
    s.close();
    刷新缓存对应的操作一定要基于事务,如果没有事务保障,缓存数据将不与数据库同步
    flush操作是强制将一级缓存数据与数据库同步,因此此时无需事务保障就可以进行
    6.快照
    快照保存了一级缓存中的一份数据的克隆,当一级缓存中的数据发生改变时,如果刷新缓存
    首先与快照进行比对
    如果不同,更新数据库,执行UPDATE,同时更新快照
    如果相同,不做任何动作
    7.操作一级缓存
    刷新一级缓存
    s.flush();
    清除一级缓存
    s.clear();
    清除一级缓存中指定对象
    s.evict(obj);
    更新一级缓存中指定对象(使用数据库中数据覆盖一级缓存数据及快照数据)
    s.refresh(obj);
    8.一级缓存刷新时机

    一级缓存操作注意事项
    1.save TO->PO
    2.update
    2.1 DO->PO
    2.2 在update将DO->PO之前,可以将数据库中的信息加载到快照区
    如果缓存数据与加载的快照数据相同,避免执行无效的UPDATE
    在class元素中配置select-before-update,该配置值默认false
    2.3 DO->PO 必须保障OID是数据库端存在的,如果不存在将抛出异常
    2.4 DO->PO 如果存在相同OID的PO,此时抛出异常
    3.saveOrUpdate
    对TO操作,insert
    对DO操作,update
    4.megre
    如果当前缓存中存在有相同的OID数据,那么将现有合并的对象数据与原始的PO进行数据合并
    如果当前缓存中没有相同的OID数据,那么首先判断当前的DO是否在数据库中存在,执行查询
    如果查询到了存在有DO对应的OID,修改
    如果查询没有存在的OID,插入
    5.get/load
    get如果获取的OID不存在,返回null
    load如果获取的OID不存在,抛异常
    6.delete
    删除一个PO对象
    如果是DO,首先DO->PO,然后删除PO
    操作注意事项:
    增删改数据时,先将对象->PO,然后再刷新缓存时才执行对应的操作
    PO (insert)*
    flush刷新时,如果是insert
    1.检测OID存在性
    不存在,并且没有生成策略,报错
    不存在,有生成策略,先获取OID,此时TO->PO->INSERT
    PO (update)
    PO (delete)
    PO ()
    PO (update)

    关联关系
    一对一
    用户数据
    1 张三 男 23 河南 1 1 2000 100 -35.6 -120
    一对多
    多对多

  • 相关阅读:
    printf函数实现的深入剖析
    rhel/centos播放mp3文件
    GRUB(GRand Unified Boot loader)引导加载程序
    NAT DHCP WWW rc.local
    论文 毕业设计 相关 用语 评语
    Linux禁止单用户模式(single)来增强系统安全
    Kernel command using Linux system calls
    GNU-ld链接脚本浅析
    AT&T汇编心得之间接寻址和LEA指令
    Linux 汇编语言开发指南
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348816.html
Copyright © 2011-2022 走看看