zoukankan      html  css  js  c++  java
  • Hibernate框架学习(三)——实体规则、对象状态、一级缓存

    一、Hibernate中的实体规则

    1、实体类创建的注意事项

      1)持久化类提供无参数构造,因为在Hibernate的底层需要使用反射生成类的实例。

      2)成员变量私有,提供公有的get和set方法,需提供属性(属性规则就是同时存在get和set方法,否则只能叫字段),因为在Hibernate底层会将查询到的数据进行封装。

      3)持久化类中的属性应尽量使用包装类型(例如用Long代替long),因为包装类和基本数据类型的默认值不同,包装类的类型语义描述更加清晰而基本数据类型不容易描述(例如考试分数为Double型,缺考者成绩为null,零分者成绩为0,不会产生歧义)。

      4)持久化类需要提供oid,与数据库中的主键列对应(因为Hibernate中需要通过这个唯一标识OID区分在内存中是否是同一个持久化类,不允许在内存中出现两个OID相同的持久化对象 )。

      5)不要使用final修饰class(hibernate使用cglib代理生成代理对象,代理对象继承被代理对象,如果被final修饰将无法生成代理)

    2、主键类型

      1)自然主键(表的业务列中,有某业务列符合必须有并且不重复的特征时,该列可以作为主键使用,少见)

      2)代理主键(表的业务列中,没有某业务列符合必须有并且不重复的特征时,创建一个没有业务意义的列作为主键,常见)

    3、主键生成策略:每条记录录入时,主键的生成规则(7个)

    代理主键:

    identity:主键自增,由数据库来维护主键值,在录入时不需要制定主键。

    sequence:Oracle中的主键生成策略。

    increment(了解):主键自增,由Hibernate来维护,每次插入前会先查询表中id最大值,加一作为新主键值(引发线程安全问题)。

    hilo(了解):高低位算法,主键自增,由Hibernate维护,开发时不使用。

    native:hilo+sequence+identity 自动三选一策略

    uuid:产生随机字符串作为主键,主键类型必须是String类型

    自然主键:

    assigned:自然主键生成策略,Hibernate不会管理主键,由开发人员自己录入

    二、Hibernate中的对象状态

    对象分为三种状态:

    1)瞬时状态:没有id,没有与session关联(即不在session缓存中)

    2)持久化状态:有id,有session关联(与数据库对应的id,若只是单纯的new一个对象,设置id为2,数据库中不存在时就是瞬时状态)

    3)游离|托管状态:有id,没有与session关联

    三种状态特点:

    save方法:其实本质不能理解成保存,而是理解成将瞬时状态转换成持久状态
      主键生成策略为主键自增:执行save方法时,为了将对象转换成持久化状态,必须生成id值,所以需要执行insert语句
      increment:执行save方法时,为了生成id,会执行查询id最大值的SQL语句

    三种状态的转换图:(持久化对象就是放入session缓存中的对象)

     三、Hibernate进阶——一级缓存

    缓存:目的提高效率,hibernate中的一级缓存也是为了提高操作数据库的效率

    提高效率的手段1:提高查询效率

    第一次查询时会将对象放入缓存,再次查询时会返回缓存中的,不再查询数据库。

    如上代码只执行一次SQL语句

    提高效率的手段2:减少不必要的修改语句发送

    修改时,会使用快照对比修改前和后对象的属性区别,只执行一次修改。

    如上代码只执行一次update语句

  • 相关阅读:
    boke
    Http post/get
    记一次网站优化---图片压缩与移动端画面缩放问题
    深入浅出 Vue.js 第九章 解析器---学习笔记
    Linux/Mac中alias的使用
    JavaScript中的函数柯里化与反柯里化
    JavaScript中深拷贝实现
    JavaScript中的节流和防抖
    博客园加入百度统计遇到的坑
    记一次无数据库下动态更新文案的解决历程
  • 原文地址:https://www.cnblogs.com/cxq1126/p/8384945.html
Copyright © 2011-2022 走看看