day28HibernateDay03(一对多和多对多 级联删除保存 cascade四种取值 配置文件 )

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>  

猜你喜欢

转载自blog.csdn.net/Entermomem/article/details/84323014