一对多关联映射
单向
一对多和多对一映射原理是一样的,都是在多的一端加入一个外键指向一的一端;
区别在于维护的关系不同:
- 多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的时候会把一加载上来;
- 一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的时候会把多加载上来。
classes——》student
table-classes: id , name
classes.java: id, name, Set < Student > students
classes.xml: id , name ,
< Set name="students" cascade="">
cascade级联操作属性:save-update、delete、all、none。
< key column="classId" /> //classId,谁维护谁加classes
< one-to-many class="com.entity.Strudent" />
< /Set >
table-student: id, name , classId
student.java: id, name,
student.xml: id , name,
在一一端维护关系存在缺陷:
因为多的一端student不知道classes的存在(也就是student没有维护与classes的关系),所以在保存student的时候关系字段classesId是为null的,如果将该字段设置为非空,则将无法保存数据
另外,因为student不维护关系,而classes维护关系,classes就会发出多余的update语句,保证classes和student有关系,这样加载classes的时候才可以把该classes对应的学生加载上来。
映射双向的目的是,有时候不是因为需求,而是为了让多的一端维护关系
存储,加载
双向
采用一对多双向关联映射的目的主要是为了解决一对多单向的缺陷,而不是需求驱动。
一对多双向关联的映射方式:
- 在一的一端的集合上采用< key>标签,在多的一端加入一个外键
- 在多的一端采用< many-to-one>标签
< key>标签和< many-to-one>标签加入的字段保持一致,否则会产生数据混乱
inverse属性:
inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效
所以,一对多关联映射我们通常在多的一端维护关系,让一的一端失效,故设置为inverse=“true”
inverse和cascade
inverse是控制方向上的反转,只影响存储
cascade是操作上的连锁反应