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语句