Hibernate中的实体类相关
OID
OID又叫做对象标识符
它是hibernate用来区分两个对象是否是同一个对象的标识
主键生成策略
1 . 持久化标识OID用来区分表中数据是否是同一条记录 , 在虚拟机内存中 区分两个对象是否是同一个标识是 "内存的地址" 内存的地址不一样 , 对象不一样
2 主键的分类 a.自然主键 用跟实体类有关系的属性作为主键 (由于业务和自身的属性绑定是比较紧密 所以一旦修改 业务代码就要响应的进行修改)
b. 新建一列和实体没有关系的属性 用他作为主键 hibernate最能帮我们生成代理主键
主要用native 和 uuid
native : 自增 只能针对数字类型 根据配置的方言 自动帮你选择主键的生成方式 . 根据底层数据库对自动生成标识符的能力来选择 sequence ,identity, hilo三种生成器中的一种,适合跨数据库平台开发 适用于代理主键
uuid : 该算法能够在网络环境中升成唯一的字符串标识 其uuid被编码为一个长度为32位的十六位进制字符串 适用于代理主键
持久化类的编写规范
实体类都需要遵从JavaBean的编写规范
持久化类 : 就是一个实体类
编写规则 : 1 公共的类 公共的无参构造方法
2私有的属性 并提供了共有的get和set方法
3 需要一个持久化标识OID
4 实体类不能使用final修饰
5 必须视线序列化接口
6 使用包装类型修饰属性 Long: 包装类型的默认值是null . long: 基本数据类型的默认值是()
持久化类 = 实体类+ 映射文件;
持久化类的三种形态
区分标准 : 有没有session 有没有ID
瞬事态 : 没有session 没有ID;
持久态: 有session 有ID 持久态对象会自动更新数据库 前提是属性发生变化
托管态 : 没有session 没有ID
Hibernate的缓存技术
缓存: 内存当中的一块临时区域 为了提高我们的访问效率
hibernate当中的缓存 : 提高数据库的查询效率
一级缓存 : session级别的缓存 随着session的创建而创建 随着session的销毁而销毁 它是自带的不可卸载
内部视线: 它是由一系列的java集合组成的(map)
数据说明时候放到缓存中:
当调用save方法 数据保存到数据库后 会放到缓存当中
当调用get方法 先查缓存 如果缓存没有 查询数据库 在查询结束之后 会放到缓存当中
当调用update方法 先更新数据库 然后将对象保存到缓存当中
验证一级缓存的存在:
先查询id为1的记录 发送sql语句 查询数据库 再查询id为1的记录 缓存存在直接返回 不发送 sql语句
二级缓存: sessionfactory级别的缓存 他不是自带的 是插件形式的 已经被redis替代
hibernate的事务管理
在核心配置文件中设置事务的隔离级别
在设置事务的隔离级别的时候 推荐大家设置为数据库默认的隔离级别
hibernate查询对象的API
Query 作用 : 使用HQL语句来查询(查询全部 条件查询 分页查询 统计查询 排序查询 投影查询)
比较面向对象的查询方式 会接受一个HQL语句
HQL : 把表的名称换成实体类的名称 把表字段名称换成实体类属性名称
查询全部: from 实体类.
条件查询 查询联系人name : from 实体类 where name=?;
分页查询: from 实体类
query.setFirstResult(0);//从第几条之后开始查询
query.setMaxReuslt(2);//每次查询的最大条数.
统计查询: 查询一共有多少联系人 : select count(ID) from 实体类
排序查询: from 实体类 order by 实体类 dese
投影查询 : 查询实体类中的部分属性 使用构造方法的方式返回对象
Criteria
作用: 它是使用对象和方法来查询 是一种更加面向对象的查询方式
QBC查询 Query By Criteria
把查询语句以及条件全部专程了对象的方法
查询全部 session.createCriteria(实体类.class)
条件查询:
criteria.add(restrictions.like("lkmName","琪琪%") )
分页查询:
统计查询:调用criteria的方法,将统计函数传递进去.
criteria.setProjection(Projections.count("lkmId"))
排序查询:
criteria.addOrder(Order.desc("lkmId"))