一、一对一:分为两种实现关联的方式分别为:
a) 基于主键实现双向一对一
i. 分清主从对象,例如 Person------IdCard 公民---身份证 主----从的关系
ii. 因为是双向,应在主对象这里设置一个IdCard的成员变量,然后在映射文件中加入<one-by-one name=”idCard”/>即可
iii. 在从对象同样设置一个Person对象的成员变量在映射文件中将主键产生的策略修改为foreign,它的主键应是引用Person方产生的主键。格式为:
<id name=”id”column=”id”>
<generatorclass=”foreign”>
<param name=”propert”>person</param>
</generator>
</id>
<one-to-onename=”person” contrained=”true”/>
Contrained属性表示为添加约束,默认的是不添加
b) 基于外键实现双向一对一
i. 主对象Person中的映射文件设置
增加<one-to-one name=”idCard” property-ref=”person_id”/> property-ref 是对应连接的是那一个字段名
ii. 从对象IdCard中的映射文件设置
利用多对一的标签来解决,指定unique属性的值为true,则表示唯一性,就会与person表呈现一对一的关系映射
<many-to-onename=”person” column=”person_id” unique=”true”/>这里的column的值应该与person指定的property-ref的值一样
二、多对一、一对多 双向关联
a) 分清多方和一方 employee----department 员工-----部门 实现双向关联
b) 先设置多方,在实体类中增加Department对象的成员变量。然后配置映射文件
<many-to-onename="depart" column="depart_id" foreign-key="id"not-null="true" />
Foreign-key属性指定的是一方的主键 not-null属性可以缺省,不能为空 就是在测试 关联的时候,一定要有一方的主键才能添加多方,否则报错。
c) 然后设置一方。在实体类中添加集合(可选用Set、List、Map等集合)泛型Set<Employee>成员变量,并配置映射文件
<set name="emps">
<!--指定员工表中外键的列名 -->
<key column="depart_id"></key>
<!-- 子标签在告诉这个集合表示一对多的关系并用class指定集合存放的对象类型 -->
<one-to-manyclass="Employee" />
</set>
d)分析:在这里实现的是双向关联。如果不配置多方,则代表的是一对多的关联,如果不配置一方,则代表的是多对一的关联
三、多对多
a) 首先分清是否是双向关联,我测试的是双向关联,Teacher----student 老师----学生
b) 配置一个多方Teacher,在实体类中增加集合(可选用Set、List、Map等集合)泛型指定的是Student的成员变量,并配置映射文件
<setname="students" table="teacher_student"><!-- table属性指定的是中间表的名字 -->
<!—映射的字段为自身的主键,为teacher_id-->
<keycolumn="teacher_id"></key>
<!—多对多标签 指定对应类Student和映射的行student_id,这里的映射应该与哪一方的自身映射的一样-->
<many-to-manyclass="Student" column="student_id">
</many-to-many>
</set>
c) 配置另一个多方,在实体类中增加集合(可选用Set、List、Map等集合)泛型指定的是Teacher的成员变量,并配置映射文件
d) 与另一方配置类似。但是必须对应。在这里映射的id应该与另一方对应
<set name="teachers"table="teacher_student">
<keycolumn="student_id"></key>
<many-to-manyclass="Teacher"column="teacher_id"></many-to-many>
</set>