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
    一对多
    多对多

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348816.html
Copyright © 2011-2022 走看看