一、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框架学习(三)——实体规则、对象状态、一级缓存的更多相关文章

  1. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  2. Hibernate-实体-对象状态-一级缓存-事务-查询

    一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造         --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...

  3. Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  4. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  5. 深入浅出学习hibernate框架(三):java的反射机制

    上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...

  6. [ SSH框架 ] Hibernate框架学习之二

    一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...

  7. Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态

    Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...

  8. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  9. Hibernate 持久化对象和一级缓存

    关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...

随机推荐

  1. vue常用方法

    vue移动端ui库: http://mint-ui.github.io/#!/zh-cn vue做app开发使用: weex 官网地址:http://weex.apache.org/cn 1.Vue组 ...

  2. input左减右加

    <!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...

  3. JsonPluginsUtil

    package utils; import java.lang.reflect.Field;import java.text.SimpleDateFormat;import java.util.Arr ...

  4. 【转】ROI Pooling

    Faster rcnn的整体构架: 训练的大致过程: 1.图片先缩放到MxN的尺寸,之后进入vgg16后得到(W/16,H/16)大小的feature map: 2.对于得到的大小为(W/16,H/1 ...

  5. 网络教程(2)光纤和RF编码简介

    光纤: 想象一个symbol是light off 另一个是light on 另一种传输信息的方式using radio waves(无线电波: 这个router 内部以很高的频率变换电压 (例如2.4 ...

  6. C语言基础 (6) 类型转换,数组与随机数

    复习 1.隐式转换 Double a Int b = 1 A = b //编译器自动转换把b转换为double类型后 再给a赋值(隐式转换) 2.强制类型转换 (变量)类型名 Int a = 1 // ...

  7. Project Euler 39 Integer right triangles( 素勾股数 )

    题意:若三边长 { a , b , c } 均为整数的直角三角形周长为 p ,当 p = 120 时,恰好存在三个不同的解:{ 20 , 48 , 52 } , { 24 , 45 , 51 } , ...

  8. Spring MVC 的概念1

    ---恢复内容开始--- SpringMVC是一个采用模型----视图------控制器(MVC)的WEb框架建立在中央前端控制器的 Servlet(DispatcherServlet),他负责发送每 ...

  9. vue使用SockJS实现webSocket通信

    以前使用websocket都是使用 window.webSocket = new WebSocket('ws://' + config.webSocketUrl + '/webData/websock ...

  10. oracle(cast , to_char , to_date )用法

    cast : cast(要转换的值 AS 转换的类型) From To BINARY_FLOAT, BINARY_DOUBLE To CHAR, VARCHAR2 To NUMBER To DATET ...