Mysql是一个关系数据库 表跟表之间存在联系
1对1 1对多 多对多
比如公司表和员工表
一个公司可以有多名员工 而一名员工只能有一个公司
这样的关系就是1对多
在比如用户和角色
用户有 张三 李四两个 角色有总监 小组长 普通
这个时候1个用户有多个角色 张三既是总监也是小组长
同时 总监这个角色 有多个用户跟他对应 张三和李四都是总监 这样的表和表之间的关系 就是多对多的关系
1对多
一对多的关系 如何维护:
把1中的主键存在多的表中,在多中 存了1的主键就叫做外键
Hibernate中维护的方式:
在公司中存一个 员工的set集合
同时在员工中存一个公司的类
配置文件配置的方式:
在多中(职工中)
<many-to-one name="enterprise" class="cn.hd.bean.Enterprise" column="enterpriseId"></many-to-one>
Name在类中的属性名 class多的一方的类名 column 生成外键的字段名
在1中(公司中)配置属性
<set name="employeesSet">
<key column="enterpriseId"></key>
<one-to-many class="cn.hd.bean.Employee"></one-to-many>
</set>
Set就是类中set name 就是公司类中存储的set变量名
Key就是外键
One-to-many写的对应关系表中的类名
多对多
用户 和角色
配置方式:在bean类当中双方都存set集合
配置文件
<set name="userSet" table="t_user_role" inverse="true">
<key column="roleId"></key>
<many-to-many column="userId" class="cn.hd.manyToMany.User"></many-to-many>
</set>
Name指得是类中的属性名 table 多对多的关系必须生成第三张来维护信息 inverse 关系维护控制 双方必须由一方维护,否则就会报错。 谁放弃?不常用的放弃。
Keycolumn 列名 在第三张表中 该字段作为外键的名字
Many-to-many column 对应的是另外一张表中外键的名字
Class对应的是第三张表中的类
一般情况下,在多对多关系中,采用级联操作
关系维护
<set name="employeesSet" cascade="save-update" inverse="true">
原则:1对多关系中 多的一方维护 1的一方放弃维护