hibernate的核心思想就是将之前对单个字段的操作变为操作一个对象,使用了ORM(Object relation mapping)对象关系映射的思想
· 在hibernate中对数据库特殊字段的有着具体配置,不同的数据库有不同的主键生成策略
映射到数据的实体对象也需要有以下几点需要注意
- 私有化成员变量
- 提供get/set方法
- 提供无参构造(底层需要反射 反射支持是无参构造)
- 类型尽量使用包装类 private int Integer 因为包装类有null值
- 需要有oid( object id )跟主键相对应
- 持久化类尽量不使用final修饰
主键的shengt生成策略、
主键的生成有俩个位置可以生成 : JAVA 数据库
自然主键: 跟业务有关 参与了业务逻辑主要用来区分不同数据 对象 保证数据不重复
订单表(order_id) 支付 将oid发送了给第三方 第三方响应回来order_id数据
代理主键: 跟业务无关 主要用来区分不同数据 对象 保证数据不重复
JAVA
手动插入
assigned : 手动插入主键
自动插入
increment: 由hibernate 自动查询数据库增长 不适合集群(多个计算机组合成的效果)
每次查询这个表的最大值 加+1 赋值
uuid : 自动产生一个随机的id值
数据库
native : 根据不同数据的底层自动增长
identity: mysql的自动增长(auto_increment) 支持自动增长字段 db2 sqlserver
sequence:oracle 自增长序列
当然在操作持久化对象的时候,持久化对象也存在三种不同的状态
对象 在创建到获得 到 session 其实经历了三种状态
* 瞬时态: 创建一个对象 瞬时态 没有OID 跟session没有关系
* 持久态: 获得一个对象 (重点) 有OID 跟session有关系
* 游离态或者脱管态:session关闭后 叫游离态 有OID 跟session没关系
hibernate的一级缓存和快照机制的原理示意图
hibernate对数据库的操作都需要开启事务
事务指的是 逻辑的一组操作,要么全部成功,要么全部失败
事务的特性:
A 原子性: 一组操作 不可再分割
C 一致性: 事务的前后数据保证一致
I 隔离性(lsolation): 多事务之间的操作
D 持久性: 事务不可逆
隔离问题:
脏读 : 一个事务读到了另一个事务没有提交的数据
不可重复读: 一个事务读到了另一个事务已提交的数据(update)
虚读/幻读: 一个事务读到了另一个事务已提交的数据(insert)
解决方案:
读未提交 不解决任何问题
读已提交 解决脏读 Oracle默认隔离级别
可重复读 解决脏读 和 不可重复读问题 mysql的默认隔离级别
串行化 解决三个问题
对事务的配置
在hibernate的核心配置文件中,
openSession() 表示 每一次调用 获得一个新的session对象
getCurrentSession() 表示获得当前线程的session对象 等效以前的将connection 绑定的到当前线程上
hibernate也存在其他的检索方式,但是使用起来要因环境而异
- oid查询 get/load
- 对象导航查询
- HQL ( Hibernate Query Language) hibernate查询语言 面向对象
- QBC ( Query By Creteria) 比hql更加面向对象 离线查询
- SQL