多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 简介 一个对象就对应着表中的一条记录,而表中的字段对应着类中的属性。 数据库中表与表之间存在着三种关系,也就是系统设计中的三种实体关系 ## 一对一 原则有两种: 1. 1. 唯一外键对应:在任意一方添加外键来描述对应关系 2. 2. 主键对应:一方的主键作为另一方的主键 ![](https://box.kancloud.cn/4fe81fa7df0d93110215b9bc819354ca_869x483.png) ~~~ Class Employee{ Private Archives archives; } Class Archives{ Private Employee employee; } ~~~ ## 一对多,多对一 客户与订单之间一对多关系(多对一) 建表原则:在多的一方添加外键来描述关联关系 ![](https://box.kancloud.cn/45b290a339f5c7e52e2820ec7d0c0597_1072x413.png) ~~~ Class Customer{ Private Set<Order> orders; } Class Order{ Private Customer c; } ~~~ ## 多对多 例如学生与老师 建表原则:通过一张中间表来描述其对应关系 ![](https://box.kancloud.cn/b22bdee598922f0ce3e2713fa37b8a4a_1072x630.png) ~~~ Class Student{ Set<Teacher> ts; } Class Teacher{ Set<Student> ss; } ~~~ # Hibernate关系映射--(一对多,多对一) 类创建 订单 ![](https://box.kancloud.cn/5443e5b3c24b6083b368ea4c790bce42_781x328.png) 客户 ![](https://box.kancloud.cn/3dac21bf3adb871e20f224e53eb946fd_992x325.png) 映射文件编写 Order.hbm.xml ![](https://box.kancloud.cn/573095c6a4616a1de7ecf4fdf7df6385_1114x241.png) Customer.hbm.xml ![](https://box.kancloud.cn/e03d0b62f9a7e9006cc842adb8dca0d9_1068x438.png) ## 测试保存 ![](https://box.kancloud.cn/12e8c5b996c2de3c55fd20a1cc349d4e_426x452.png) 上面操作是一种双向关联 问题:我们可不可以只保存订单或只保存客户完成保存操作? ## 测试单向关联保存 ![](https://box.kancloud.cn/6efdec2a3f6ce882f20ffa6f568912a4_1152x422.png) 这个异常代表提一个持久化对象关联了一个瞬时对象。 我们可以使用级联操作来解决上述的问题. 我们现在要做的是保存订单时保存客户,需要在订单的hbm配置文件中修改 ![](https://box.kancloud.cn/18a906cdd3d11e64915f7087b0cc6d37_1117x457.png) ## 双向关联维护 我们在开发中要配置双向关联配置。---------可以通过任意一方来操作对方 在操作代码,尽量来要进行单向关联。------可以尽量资源浪费。 在双向关联中,会存在多余的update语句。 我们可以使用inverse属性来设置,双向关联时由哪一方来维护表与表之间的关系。 ![](https://box.kancloud.cn/2bd4e6bc63c278a1808b5ade425b848e_1023x405.png) # 级联删除 我们在删除客户时,也要删除订单,如果没有做级联,那么这个操作是不允许。 为了维护数据完整性 ![](https://box.kancloud.cn/d5316bc644a655ef43158cee108f5e51_1109x124.png) 想要完成操作:我们可以在客户中添加`cascade=”delete”;` ![](https://box.kancloud.cn/3d3e49e59278d1a2f9d416ff94a7fb74_1058x649.png) ![](https://box.kancloud.cn/8f1b061555269cb4f0508ca5e83b0bc3_1081x207.png) # cascade总结 使用cascade可以完成级联操作 它可常用取值: none这是一个默认值 save-update,当我们配置它时,底层使用save update或save-update完成操作,级联保存临时对象,如果是游离对象,会执行update. delete 级联删除 delete-ophan 删除与当前对象解除关系的对象。 all 它包含了save-update delete操作 all-delete-orphan 它包信了delete-orphan与all操作 # cascade与inverse有什么区别? cascade它是完成级联操作 Inverse它只有在双向关联情况下有作用,它来指定由哪一方维护外键 # 多对多 我们使用注解完成多对多配置. 描述学生与老师. 使用@ManyToMany来配置多对多,只需要在一端配置中间表,另一端使用mappedBy表示放置外键维护权。 创建PO类 Teacher类中 ![](https://box.kancloud.cn/0af673d69a71175a264b0e6d4152af0f_774x517.png) ## 级联保存操作测试 因为我们将外键的维护权利由Student来维护,我们演示保存学生时,将都也级联保存。 ![](https://box.kancloud.cn/1784fac6fb33136c6ff57973000e9efe_788x463.png) # 一对一 以人与身份证号为例 一对一操作有两种映射方式: 1. 1. 在任意一方添加外键 2. 2. 主键映射 ## 外键映射 创建实体 User类 ![](https://box.kancloud.cn/9b20ea2a4ec598f4c2d6d866d9632c8d_748x287.png) 上述配置,t_user表放弃对外键的维护权利 IDCard类 ![](https://box.kancloud.cn/135499cb3af4a00307d94db458d6ceb4_742x875.png)