Mysql是一个关系型数据库 表和表之间存在关联
一对一 一对多 多对多
比如公司表和员工表
一个公司可以有多名员工 而一名员工只能对应一个公司 这样的关系就是一对多
再比如用户和角色
用户有张三、李四 2 个 角色有 总监 小组长 普通
这个时候 1 个 用户有多个角色 张三即是总监也是组长
同时 总监这个角色 有多少用户和他对应 张三和李四都是总监 这样的表和表之间的关系就是多对应多的关系
一对多
一对多的关系如何维护
我们会把一中的主键存在多的表中,在多中存了一的主键叫做外键
Hibernate中维护的方式:
在公司中存一个员工的set集合
同时在员工中存一个公司的类
配置文件配置的方式:
在多中(职工中)
<many-to-one name="enterprise" class="cn.hd.bean.Enterprise" column="enterpriseId"></many-to-one>
Name = 在类中的属性名 class 存的是多的一方的类名 column 生成外键的字段名
在一中(公司中)
<set name="employeeSet">
<key column="enterpriseId"></key>
<!--一对多 声明和那个是一对多-->
<one-to-many class="cn.hd.bean.Employee"></one-to-many>
</set>
Set 就是类中set name 就是公司类中存储的set变量名
Key 就是外键
one-to-many 写的是对应关系表中的类名
级联操作:
再保存企业的同时,将这个企业中的所有职工也同时保存 这样就少写了保存职工的代码
<!--
cascade: 就是级联操作 为了简化代码
save-update 再保存(修改)企业过程中 随着保存(修改)企业的保存(修改)而保存(修改)
delete 不推荐 就是不安全
all 同上
-->
<set name="employeeSet" cascade="save-update">
关系维护
<!--
inverse 关系维护
true 放弃维护
false 维护 (默认的值)
-->
<set name="employeeSet" cascade="save-update" inverse="true">
原则:一对多关系中 多的一方维护 一的一方放弃维护
多对多
用户 和 角色
在bean类中 双方都存set集合
在配置文件中如何实现
配置文件中的配置
<set name="roleSet" table="t_user_role" inverse="true" >
<key column="roleId"></key>
<many-to-many class="cn.hd.manyToMany.User" column="userId"></many-to-many>
</set>
Name指的是 类中的属性名 table 多对多的关系必须生成第三张表来维护信息 inverse 关系维护控制 双方 必须由一方放弃维护,否则就会报错。谁放弃?不常用的放弃。
Key column 列名 在第三张表中 该字段作为外键的名字
many-to-many column 对应的是第三张表另外一个表中的外键名字
Class 对应的是第三张表中的类
一般情况下,在多对多关系中,采用级联操作
<set name="roleSet" table="t_user_role" cascade="save-update">
<key column="userId"></key>
<many-to-many class="cn.hd.manyToMany.Role" column="roleId"></many-to-many>
</set>