一对多是比较普遍的映射关系,比如班级与同学关系,消费者预订单关系,某个人的留言......
一对多:从班级的角度来看一个班级可以有很多个同学。
多对一:从学生的角度来看多个同学可以对应一个班级。
根据实际情况也有不同的映射方式:
一."一方"的java类中含有"多方"对象的set集合,而"多方"的java类中含有"一方"的id而不是一个对象。
java类图:
数据库表设计,在message表中定义一个外键关联student:
student.hbm.xml中:
<!--
将 lazy 设置为false 表面查询一个student的时候查询该student的所有message
lazy默认为 true
-->
<set name="messages" lazay="false"> <key column="stu_id"></key> <one-to-many class="showGoal.model.Target"/> </set>
message.hbm.xml中无需特别指定。
二."一方"的java类中含有"多方"对象的set集合,而"多方"的java类中含有"一方"的i一个对象。
java类图:
数据库表的设计不变:
student.hbm.xml:
同上:
<set name="messages" lazay="false"> <key column="stu_id"></key> <one-to-many class="showGoal.model.Target"/> </set>
message.hbm.xml:
<many-to-one name="student" class="xxx.student" column="stu_id" cascade="save-update"> </many-to-one>
三.这种情况比较特殊就是自身的一对多关联。比如message与message的回复,就是自身的一对多关联
<set name="messagesReply" cascade="all" inverse="true"> <key column="id"></key> <one-to-many class="xxxx.Message"/> </set> <many-to-one name="parentMeeage" class="xxxs.Category" column="parent_id"> </many-to-one>
注:1.<set>元素的lazy属性,默认为true。表示加载student 的时候不会加载student的message集合。
false,则相反。
2.<set>元素的cascade属性:
是用来说明数据库中两个表之间相互关系(一对一,一对多,多对多)中,当对主对象进行某种操作时, 是 否对其关联的从对象也作类似的操作(比如有对象 Department和Employee,它们之间是一对多的关系,当保存Department时,其对应的Employee是否也相应的保存),常见的 级联(Cascade)有:
(1)none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联操作。它是默认值。
(2)save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,游离对象)。
(3)delete:在删除当前对象时,级联删除附属对象。
(4)all:所有情况下均进行级联操作,即包含save-update和delete等等操作。
(5)delete-orphan:删除此对象的同时删除与当前对象解除关系的孤儿对象(仅仅使用于一对多关联关系 中)。
当然也可以在数据库中定义外键的时候设置删除时,更新时相应的操作来等效的实现cascade的操作
小生菜鸟一个,如果大神们对博客有什么意尽管说出来,虚心接受。我会很高兴的哦 谢了