Hibernate学习笔记(三)

时间:2021-10-04 21:42:12

我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改
以下是b站视频地址:
https://www.bilibili.com/video/av14626440

 
*表与表之间的关系回顾(一对多)
1)分类与商品,一个分类可以有多个商品,一个商品只能属于一个分类
 
*表与表之间的关系回顾(多对多)
1)订单与商品,一个订单里面可以有多个商品,一个商品可以属于多个订单
 
*表与表之间的关系回顾(一对一)
1)在中国,夫妻关系便是一对一的关系
 
 
*hibernate一对多的配置
1.映射配置(以客户和联系人为例)
第一步,创建实体类
第二部,让两个实体类之间相互表示
1)在客户实体类里面使用set集合表示多个联系人
Hibernate学习笔记(三)Hibernate学习笔记(三)
2)在联系人是类中表示所属客户
Hibernate学习笔记(三)Hibernate学习笔记(三)
第三步,配置映射文件
一对多
Hibernate学习笔记(三)Hibernate学习笔记(三)
多对一
Hibernate学习笔记(三)Hibernate学习笔记(三)
第四步,配置核心配置文件
Hibernate学习笔记(三)Hibernate学习笔记(三)
<!--   
                mysql5 数据库方言设置为org.hibernate.dialect.MySQL5Dialect ,使用org.hibernate.dialect.MySQLDialect不知为何会报DDL错误
-->
 
2.一对多级联操作
级联操作
1,级联保存
2,级联删除
 
一对多的级联保存
添加客户,为这个客户添加一个联系人
1)复杂写法
Hibernate学习笔记(三)Hibernate学习笔记(三)
2)简化写法
一般根据客户添加联系人
第一步 在客户的映射文件中配置
在客户映射文件中set标签上进行配置cascade属性
Hibernate学习笔记(三)Hibernate学习笔记(三)
 
第二步 只需要把联系人添加到客户里面,最终只需要保存客户对象
Hibernate学习笔记(三)Hibernate学习笔记(三)
 
一对多的级联删除
需求:删除某个客户,把这个客户里面的联系人一并删除
实现:
第一步:在客户的映射文件set标签中进行配置
        使用属性cascade属性值delete
Hibernate学习笔记(三)Hibernate学习笔记(三)
 
第一步:在代码中直接删除客户
1)查询对象,调用session里面的delete方法删除
Hibernate学习笔记(三)Hibernate学习笔记(三)
2)执行过程
1,根据id查询客户
2,根据客户查询联系人
3,将联系人的cid字段设置为null
4,先删除联系人,再删除客户
 
 
 
一对多的修改操作
修改小红所属的客户(持久态自动修改数据库)
Hibernate学习笔记(三)Hibernate学习笔记(三)
 
 
inverse属性
因为hibernate双向维护外键,客户和联系人都需要修改外键,修改客户时修改了一次,修改联系人的时候也修改了一次,所以会出现两次update,造成性能问题
Hibernate学习笔记(三)Hibernate学习笔记(三)
解决方式:让其中一方放弃维护外键
一对多里面可以让其中一的那一方放弃外键维护
Hibernate学习笔记(三)Hibernate学习笔记(三)
Hibernate学习笔记(三)Hibernate学习笔记(三)
 
Hibernate多对多操作
多对多映射配置
以用户和角色为例演示
第一步 创建实体类,用户和角色
 
第二步 让两个实体类互相表示
1)用户里面表示所有角色,使用set集合
2)一个角色有多个用户,使用set集合
 
第三步 配置映射关系
1)基本配置
2)配置多对多关系(重点)
Hibernate学习笔记(三)Hibernate学习笔记(三)
 
发现问题:
Hibernate学习笔记(三)Hibernate学习笔记(三)
Hibernate学习笔记(三)Hibernate学习笔记(三)
第四步 在核心配置文件中引入映射文件
 
测试:
 
多对多级联保存
根据用户保存角色
第一步 在用户配置文件中的set标签进行配置,cascade值save-update
第二步 写代码实现
1)创建角色用户对象,把角色放到用户里面,最终保存用户
//添加两个用户,为每个用户添加两个角色
       //1,创建对象
       User user1 = new User();
       user1.setUser_name("lucy");
       user1.setUser_password("123");
       
       User user2 = new User();
       user2.setUser_name("mary");
       user2.setUser_password("456");
       
       
       Role r1 = new Role();
       r1.setRole_name("总经理");
       r1.setRole_memo("总经理");
       
       Role r2 = new Role();
       r2.setRole_name("秘书");
       r2.setRole_memo("秘书");
       
       Role r3 = new Role();
       r3.setRole_name("保安");
       r3.setRole_memo("保安");
       
       //2.建立关系,把角色放到用户里面
       //user1······r1,r2
       //user2······r2,r3
       user1.getRoleSet().add(r1);
       user1.getRoleSet().add(r2);
       
       user2.getRoleSet().add(r2);
       user2.getRoleSet().add(r3);
       //3.保存用户
       session.save(user1);
       session.save(user2);
 
 
多对多级联删除(了解)
第一步 在set标签上进行配置,cascade值delete
第二部 删除用户
 
维护第三张表
1.用户和角色是多对多的关系,维护关系通过维护第三张表
2.让某个用户有某个角色
第一步 现根据id查询出用户和角色
第二部 把角色放到用户里面去
1)把角色对象放到用户的set集合中去
Hibernate学习笔记(三)Hibernate学习笔记(三)
3让某个用户失去某个角色
第一步 现根据id查询出用户和角色
第二步 把角色从set里面去掉
Hibernate学习笔记(三)Hibernate学习笔记(三)