就是配置表关联:这里我们主要总结一下各种关系的配置,做一下记录;
表之间的关联结构有以下七种映射关联关系:
1、单向一对一关联映射(one-to-one)
:一对一就是把写在一张表的字段分开了,但是这些信息在别的表也需要,就可以分开来写,不然每个表都要添加相应的字段,只需要一个额外唯一外键关联即可(一张表尽量不要写的字段太多)。
配置主键关联:就是表不添加额外的字段来维护之间的关系,但是主键要相对应。(不实用,扩展性不好)(级联没写,如果需要几张表同时增删改,要加上级联,查询不用)
xml配置 person表关联idcard表
<
one-to-one
name
=
"idcard"
property-ref
="
引用IdCard主键属性
"
/>
|
配置唯一外键(可以是主键)关联 ,这时候必须要用many-to-one,因为one-to-one无法关联外键。其实一对一是特殊的多对一。
xml配置 person表关联idcard表
<
many-to-one
name
=
"idcard"
column
=
"idcard表的外键字段"
/>
|
2、单向多对一关系映射(many-to-one)
这个必须要在多的一方加一个外键关联。
其实跟上面的配置是一样的不多写了,其实是一对一还是多对一都要你自己控制。
3、单向一对多关系映射(one-to-many)
一对多和多对一原理是一样的,都是在多的一段加入一个外键。
但是配置肯定不一样。可以用别的集合list,map去接收
xml配置 class表关联student表
<set name="students" table="student" cascade="all" >
<key column="classId" />
<one-to-many class="Student" />
</set>
|
如果单独用单向一对多是不行的,因为多的一方不知道一的存在,也就是studnet没有维护和class的关系,那么就会造成多的外键信息无法添加为空(我测试插入的是会自增,更新会覆盖之前的外键字段)。所有我们平常都是使用双向关联映射。
4、单向多对多关联映射(many-to-many)
多对多必须通过添加额外的一张关联表来实现(mybatis可以不添加表就能实现,添加一个字符串字段就可以实现):
xml配置:teacher表关联classroom表
<set name="classrooms" table="class_teacher">
<key column="teacher_id"/>
<many-to-many class="Classroom" column="class_id" />
</set>
|
增删改需要级联,对这张表的操作需要把老师添加到某个班级中就可以,然后save班级就能实现对表的关系表的更改,如果老师是一个新老师就会在新老师表中自动添加。
5、 双向一对一关联映射:
前面我们说过单向一对一,反过来也配置one-to-one。其实配不配无所谓。
6、双向一对多关联映射(非常重要)
采用一对多的关联映射主要是为了解决一对多单向关联的缺陷而不是需求驱动的。刚才我们也说的单向一对多是有缺陷的。
配置方式:
* 在一的一段的集合上采用<key>标签,在多的一端加入一个外键
* 在多的一端采用<many-to-one>标签。
xml配置:class关联studnet
<
set
name
=
"students"
inverse
=
"true"
>
<
key
column
=
"class_id"
></
key
>
<
one-to-many
class
=
"Student"
/>
</
set
>
|
student关联class
<
many-to-one
name
=
"classroom"
column
=
"classId"
/>
|
关键inverse属性:
inverse属性可以用在一对多和多对多双向关联上,默认是false,表示本端可以维护表的关系,如果inverse为true,则会交给另一端去维护关系,本端失效。所以在一对多中,我们通常让多的一段维护关系,让一的一端失效。
7、双向多对多关联映射(many-to-many)
双向就是两端都能将对方加载上来,两端都需要配置xml文件,但是需要注意的是:
* 生成的中间表名称必须一样。
* 生成的中间表的字段必须一样。
xml配置:class关联teacher
<
set
name
=
"teachers"
table
=
"class_teacher"
cascade
=
"all"
>
<
key
column
=
"class_id"
>
</
key
>
<
many-to-many
class
=
"Teacher"
column
=
"teacher_id"/
>
</
set
>
|
teacher关联class
<
set
name
=
"classrooms"
table
=
"class_teacher"
cascade
=
"all"
>
<
key
column
=
"teacher_id"/
>
<
many-to-many
class
=
"Classroom"
column
=
"class_id"
/>
</
set
>
|
注意我们在关联插入的时候:若都设置级联,会导致主键重复插入失败;需要设置一方不维护这个关系;
如果把inverse都设置为true,那就没有表来维护中间这张表,他们只会往自己的表中添加或修改数据,而不会添加到中间表中。