1)不管是一般的集合,还是一对多、多对多关系,都要使用到set,区别只是前者set中为一般类型,后者为对象。
具体写法:
一般类型
<set name="addressSet" table="user_address_set">
<key column="userId"/>
<element type="string" column="address"/>
</set>
一对多映射
<set name="employees" table="t_employees">
<key column="departmentId"/>
<one-to-many class="cn.com.cpf.pojo.Employee"/>
</set>
<many-to-one name="department" class="cn.com.cpf.pojo.Department" column="departmentId"></many-to-one>
多对多映射
<set name="students" table="teacher_student" inverse="true">
<key column="teacherId"/>
<many-to-many class="cn.com.cpf.pojo.Student" column="studentId"/>
</set>
<set name="teachers" table="teacher_student">
<key column="studentId"/>
<many-to-many class="cn.com.cpf.pojo.Teacher" column="teacherId"/>
</set>
说明:
1>所有的key指的都是中间表中映射本表主键的那个列
2>所有的name指的都是本类中的属性名称
3>如果set中元素为一般类型,那么set中使用element元素,指定类型和对应的中间表的列
4>如果set中元素为类,那么set中根据情况使用one-to-many或many-to-many,使用class指定类型
2) inverse属性
1> 在一对多关系中,inverse表示是否自己来设置多的那张表中的外键值
2> 在多对多关系中,inverse表示是否自己来往中间表中插入数据
3> inverse讨论的只是外键的操作,cascade讨论的是关联对象操作时候的关系
3) 单向关系
单向一对多
单向多对一
单向多对多
一对一
对于单向关系,只能从维护外键的那一方进行解除关系和删除操作
4) 操作总结
1> 保存
不管何种关联关系,有没有关系,都直接save即可
注意:建议先保存没有外键的一方,这样就可以先生成id,那么有外键的一方保存的时候就可以直接保存,而不用update了
2 > 解除关联关系
实质也就是设置关联的另一方为null
注意:只有维护关联关系,且不是主键关联的才能解除
3> 删除对象
从维护关系的一方删除肯定不会有问题,因为外键就在这里,直接删即可
从没有外键的一方删除会有问题,因为已经被另一方引用了主键