1、持久化类和一级缓存
持久化类:JavaBean+映射的配置文件
持久化对象的三种状态
瞬时态
持久态
脱管态
Session的一级缓存,快照机制
主键的生成策略
常用uuid native
2、管理事务
设置隔离级别
丢失更新的问题,乐观锁:添加属性version,配置<version name="version">
绑定本地的session,事务需要在service层开启,dao层需要使用session对象
3、查询的接口
Query接口:HQL的查询
Criteria接口:QBC查询(按条件进行查询)
关联关系映射一对多映射
1、一对多的设计
2、导入SQL的建表语句
创建数据库
导入SQL脚本
3、编写客户和联系人的JavaBean程序(一对多的编写规则)
级联保存
1、如果代码只插入其中的一方的数据
如果只保存其中的一方的数据,那么程序会抛出异常
如果想完成只保存一方的数据,并且把相关联的数据都保存到数据库中,那么需要配置级联
级联保存是方向性的
2、级联保存的效果
级联保存:保存一方的同时可以把关联的对象也保存到数据库中
使用cascade="save-update"
级联删除
1、含有外键的删除客户功能,那么SQL语句会报错
delete from customers where cid =1;
2、如果使用Hibernate框架直接删除客户的时候 发现可删除
3、上述的删除是普通的删除,也可以使用级联删除,级联删除有方向性
<many-to-one cascade="delete"/> 一般都是假删除就加个字段置1或0表示已删除
cascade的取值和孤儿删除
1、取值
none 不使用级联
save-update 级联保存或更新
delete 级联删除
delete-orphan 孤儿删除(只能应用在一对多关系)
all 除了delete-orphan的所有情况(包含save-update delete)
all-delete-orphan 包含了delete-orphan的所有情况(包含save-update delete delete-orphan)
2、孤儿删除(孤子删除)只有在一对多的环境下才有孤儿删除
在一对多的关系下,可以将一的一方认为是父方,将多的一方认为是子方,孤儿删除:在解除了父子关系的时候,将子方记录就直接删除
<many-to-one cascade="delete-orphan"/>
某一方放弃外键的维护,为多对多作准备
1、双方都维护外键的时候,会产生多于的SQL语句
想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句
产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句
2、如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护
在<set>标签上配置一个inverse="true",true:放弃,false:不放弃 默认false
<inverse="true">
cascade和inverse的区别
1、cascade用来级联操作(保存或者修改和删除)
多方 save-update
2、inverse用来维护外键的
一方放弃维护
级联保存
<set cascade="save-update">
级联删除(在多对多很少使用)
级联删除
role.hbm.xml
<!-- 配置多对多
name 集合的名称
table 中间表的名称
-->
<set name="roles" table="sys_user_role" cascade="save-update">
<!-- 当前对象在中间表的外键名称 -->
<key column="uid"></key>
<!--
class 集合中存入对象,对象的全路径
column 集合中对象在中间表的外键名称
-->
<many-to-many class="my.domain.Role" column="rid"/>
</set>
User.hbm.xml
<!-- 配置多对多
name 集合的名称
table 中间表的名称
-->
<set name="roles" table="sys_user_role" cascade="save-update">
<!-- 当前对象在中间表的外键名称 -->
<key column="uid"></key>
<!--
class 集合中存入对象,对象的全路径
column 集合中对象在中间表的外键名称
-->
<many-to-many class="my.domain.Role" column="rid"/>
</set>