一对多
O Dept Employee
关系属性:Set<Employee> emps=new HashSet<Employee> Dept
R 表
t_dept 普通的字段
t_employee 普通的字段+d_id(外键)
M 映射文件
<class name=" xx" table="Dept">
<id ....></id>
...
<!--关系属性
为了减少多次更新的操作,inverse="true":是key标签失效
-->
<set name="关系属性的名称" cascade="save-update" inverse="true">
<key column="d_id"/><!--外键-->
<one-to-many class="Employee"/>
</set>
</class>
<class name="Employee" table="employee">
<id>....</id>
....
<!--关系属性 employee 有一个外键列 d_id-->
<many-to-one name="dept" class="Dept" column="d_id"
cascade="save-update"></many-to-one>
</class>
当设置cascade=save-update 删除不级联删除
1.如果删除的当前对象能够获得明确的外键列的话,可以直接删除,不用再内存中解除关系
2.如果删除的当前对象不能获得明确的外键列的话,要先解除关系在删除
注意:inverse="true"
保存对象时,如果有关联对象,要现在内存中确定他们的关系,而且应该能双向设置
一对多的自身相关
以Emp表为例:一个雇员会有多个下属,一个雇员也只能有一个上级
从员工找经理(1:1)
class Emp{//配置员工
Integer empNo
String eName
String job
Emp mrg //经理也是员工,我们需要获得是Emp而不是一个经理的empNo
Date hireDate
Double sal //如果表当中的该字段允许为null ,对象中应该使用封装类
Double comm
Integer deptNo
}
从经理找员工{1:*}
class Emp{
Integer empNo
String eName
String job
Integer mrg
Date hireDate
Double sal
Double comm
Integer deptNo
Set<Emp> undering;//关系属性
}
自身相关的双向关系
class Emp{
Integer empNo
String eName
String job
Emp mrg //可以从员工查找经理
Date hireDate
Double sal
Double comm
Integer deptNo
Set<Emp> undering;//可以从经理查找员工
}
多对多
O Student Course 一个学生有多门课程,一个课程有多个学生
* : *
关系属性 Set<Course> Set<Student>
R 如何在数据库中表明多对多的关系,提供第三张表,作为关系表
t_student t_course 关系表 t_s_c
id name age id name score s_id c_id 两列联合唯一
1 haoren 22 1 java 1 1 1
2 clam 23 2 c++ 1 1 2
M 多对多映射文件 三张表两个外建