Hibernate的持久化类状态
持久化类:实体类 与数据库表建立了映射 Hibernate中的持久化类有三种状态
transient 瞬时态(临时态)
持久化对象没有唯一标识oid 没有纳入到session的管理
瞬时态 获得 Book book=new Book();
瞬时态 转换为 持久态 save(book) saveOrUpdate();
瞬时态 转换为 脱管态 book.setId(1); 设置oid
persistent持久态
持久化对象有唯一标识oid 已经纳入到session的管理
持久态的持久化对象具有自动更新数据库的能力(依赖于Hibernate的一级缓存)
持久态 获得 Book book= (Book) session.get(Book.class,1); get/load()/find()/iterate()
持久态 转换为 瞬时态 delete(book) 删除态 不建议使用
持久态 转换为 脱管态 session.close(); close()/clear()/evict();
Detached 脱管态(离线态)
持久化对象有唯一标识oid 没有纳入到session的管理
托管态 转换为 持久态 session.update(): update()/saveOrUpdate()/lock()
托管态 转换为 瞬时态 book.setId(null);
Hibernate一级缓存
缓存:将数据库/硬盘文件中的数据 放到缓存中(内存中的一块空间) 再次使用时,不使用sql 可以直接从内存中获取
优势:可以提升程序运行的效率 缓存是hibernate优化的一个手段
一级缓存 Session级别的缓存 在Session的接口的实现中包含了一系列Java集合 Java集合构成了Session缓存 与session的生命周期一致
向一级缓存中存入数据的时候,放入一级缓存区和一级缓存快照区
当更新一级缓存的数据的时候,事务提交,对比一级缓存区和一级缓存快照区,如果数据一致,不更新,数据不一致,自动更新数据库
clear() 清空一级缓存中所有的对象
evict(Object obj) 清空一级缓存中的某个对象
flush() 刷出缓存
每间隔一段时间,session会执行一些必须的sql语句将内存中对象的状态同步到JDBC连接中,这个过程称之为flush 刷出 强制缓存与数据库一致
refresh(Object obj) 将快照区的数据重新覆盖一级缓存的数据
设置一级缓存的刷出时机 setFlushMode()
FlushMode.ALWAYS 每次查询都会刷出
FlushMode.AUTO 默认值 有些查询会刷出
FlushMode.COMMIT 事务提交的时候 手动调用
FlushMode.MANUAL 手动调用flush才会刷出
在Hibernate实体类映射文件中 <class>标签中 设置 select-before-update="true" 在更新之前先去查询
HIbernate关联关系的映射
实体之间的关系
一对多 (如一个用户生成多个订单 每一个订单只属于一个用户)
在多的一方 创建一个字段 作为外键 指向一 的主键
多对多 (一个学生选择多门课程 一个课程也可以被多个学生选择)
创建第三张表 中间表2个字段分别指向2个方向
一对一(一个公司只能有一个注册地址 只能被一个公司使用)
创建unique外键 双方通过主键进行关联
创建实体类
建立映射 配置集合set
一对多配置
<set name="orders">
<key colunmn=" "></key> 用来描述一对多 多的一方外键的名称
<one-to-many class=" ">多的一方 类路径
</set>
多对一配置
<many-to-one name=" " column=" "class=" ">
多对多配置
<set name=students"table=" ">
<key column=" "></key> 中间表 外键
<many to many class=""column="">
</set>
一对多和多对一产生的问题 双向维护 会产生多余的sql
inverse="true" 一般情况下 一的乙方放弃外键的维护权
Hibernate级联操作
级联:操作当前对象时,对其关联对象的处理
cascade="save-update" 保存和更新的时候使用级联
"delete" 删除的时候使用级联
"none" 不使用级联
"all" 除了孤子删除之外的所有级联
"delete-orphan" 孤子删除 一对多 多为父 一为子 父被删除 子也不存在
“all-delete-orphan” 包含孤子删除的所有级联