Hibernate框架学习(三)——实体规则、对象状态、一级缓存

时间:2022-04-07 16:44:49

一、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个)

Hibernate框架学习(三)——实体规则、对象状态、一级缓存

代理主键:

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关联

Hibernate框架学习(三)——实体规则、对象状态、一级缓存

三种状态特点:

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

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

Hibernate框架学习(三)——实体规则、对象状态、一级缓存

三、Hibernate进阶——一级缓存

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

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

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

Hibernate框架学习(三)——实体规则、对象状态、一级缓存

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

Hibernate框架学习(三)——实体规则、对象状态、一级缓存

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

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

Hibernate框架学习(三)——实体规则、对象状态、一级缓存

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

Hibernate框架学习(三)——实体规则、对象状态、一级缓存