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

Hibernate框架学习(三)——实体规则、对象状态、一级缓存的更多相关文章
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Hibernate-实体-对象状态-一级缓存-事务-查询
一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造 --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- hibernate框架学习之对象状态
lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...
- 深入浅出学习hibernate框架(三):java的反射机制
上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...
- [ SSH框架 ] Hibernate框架学习之二
一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...
- Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态
Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- Hibernate 持久化对象和一级缓存
关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...
随机推荐
- cms初步构想
一.cms系统的初步构想 公司正准备使用yii框架重新弄个类cms的系统: 初步的功能: 栏目文章的管理 SEO的优化功能 推荐位管理 一些思路和规则: 数据库表名的定义:通过"大模块名称+ ...
- 04--C语言文件操作函数大全(超详细)
fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const cha ...
- CDR快速制作苹果手机照片小图标
本篇教程用CorelDRAW快速制作苹果手机照片小图标,在实现的过程中主要使用了旋转复制的方法,加之一些常用工具的用法处理,最后加上透明效果下的合并模式就好了,现在跟小编一起来看看详细的操作吧! 1. ...
- 使用序列号激活优动漫PAINT(附激活码)
优动漫PAINT是一款功能强大的动漫绘图软件,简单的中文界面和丰富的笔刷操纵,再次为设计工作者带来非一般的感受!最近,有不少小伙伴提出这样的疑问:购买安装优动漫PAINT之后,不知道如何激活,在哪里输 ...
- TF从文件中读取数据
从文件中读取数据 在TensorFlow中进行模型训练时,在官网给出的三种读取方式,中最好的文件读取方式就是将利用队列进行文件读取,而且步骤有两步: 把样本数据写入TFRecords二进制文件 从队列 ...
- mysql 锁表查看
information_schema.INNODB_TRX 一般锁表后查询这个表 把相关的事务执行线程kill就可以了,可以分析sql语句执行场景 INNODB_LOCKS PROCES ...
- 安装sublimeServer插件
1.安装目的 做练习在谷歌浏览器中遇到报错信息:axios.min.js:8 Failed to load file:///E:/%E8%87%AA%E5%AD%A6/vue%E5%AD%A6%E4% ...
- Linux学习一:图解CentOS 6.5安装步骤
1 进入安装界面 2 选择语言 3 选择键盘 4 选择存储类型 5 是否格式化硬盘 6 设置主机名 7 配置网卡 (1)选择网卡并编辑 (2)配置IPv4 (3)查看虚拟网络编辑器 NAT设置 DHC ...
- Python JSON - 世界人口图
世界人口图 从https://datahub.io/网站搜索population,下载世界人口json数据. from pygal.maps.world import COUNTRIES def ge ...
- chckBox样式的修改
在Android开发中,系统自带的默认CheckBox由于比较简陋,可能难以满足部分人的审美需求,不过,Android具有很强的扩展性,自定义CheckBox其实也很简单. 1. Layout中定义C ...