再次认识Hibernate(二)
来源:互联网 发布:Python log日志的级别 编辑:程序博客网 时间:2024/04/29 14:19
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” 包含孤子删除的所有级联
- 再次认识Hibernate(二)
- 再次认识Hibernate(一)
- 再次认识Hibernate(三)
- 再次认识Hibernate(四)
- 再次认识mysql(二)
- 再次认识Spring(二)
- 再次认识Struts2(二)
- 再次认识mysql(一)
- 再次认识mysql(三)
- 再次认识mysql(四)
- 再次认识mysql(五)
- 再次认识Spring(一)
- 【Hibernate学习】 ——ORM(四)再次认识实体继承
- 再次认识mysql(六)触发器
- 再次认识mysql(七)存储过程
- 再次认识mysql(八)操作权限
- 再次认识String类
- 再次认识多态
- HDU 2035 快速幂取模
- 屏幕适配的注意事项
- 机器学习练习(二)——多元线性回归
- 8086乘除指令详解(二)
- js中的undefined,null,空字符串,false,true之间的关系
- 再次认识Hibernate(二)
- 【42.38%】【BZOJ 3196】二逼平衡树
- 玩无限消乐的设计示例(高级篇)直线特效算法
- 小话设计模式(十六)中介者模式
- 122. Best Time to Buy and Sell Stock II(贪心)
- 【转载】姐妹们别再被骗了,香港记者暗访报道了香港验血鉴定胎儿性别的骗局
- 使用Genymotion模拟器调试出现INSTALL_FAILED_CPU_ABI_INCOMPATIBLE错误的解决办法
- jarspertreport6.3解决barbecue1.5 linxu服务器中打印条码无法显示数字
- 深入理解Java中的final关键字