多对一关联映射其实涉及到一个问题,即多对一和一对多,看似一样,但在Hibernate中却不同,它体现了关系的维护端在哪一方。下面分别看看这两种关联映射:
1、多对一关联映射(关系维护在User端)
1
)
User
<hibernate-mapping>
<class name="com.tgb.hibernate.User" table="t_user"><id name="id"><generator class="native" /></id><property name="name" /><!-- cascade="save-update"为级联,可以通过user的关联属性group读取group的属性值 --><many-to-one name="class" column="classid" cascade="save-update" /></class></hibernate-mapping>
2)Class
<hibernate-mapping>
<class name="com.tgb.hibernate.Class" table="t_class"><id name="id"><generator class="native" /></id><property name="name" /></class></hibernate-mapping>
2、一对多关联映射(关系维护在Class端)
1
)
Student-class
映射关系(单向映射):
i、student
<hibernate-mapping>
<class name="com.tgb.hibernate.Student" table="t_student"><id name="id"><generator class="native" /></id><property name="name" /></class></hibernate-mapping>
ii
、
Class
<hibernate-mapping>
<class name="com.tgb.hibernate.Classes" table="t_classes"><id name="id"><generator class="native" /></id><property name="name" /><!-- inverse默认为false,表示可以维护关系,将其设置为true,则本端不维护关系,交给 另外一端即student维护关系 --><set name="students" inverse="true"><key column="classesid" /><one-to-many class="com.tgb.hibernate.Student"/></set></class></hibernate-mapping>
2)Student-class 映射关系(双向映射,就是在Student端加入Class的关联,其余的不变)
<hibernate-mapping>
<class name="com.tgb.hibernate.Student" table="t_student"><id name="id"><generator class="native" /></id><property name="name" /><many-to-one name="classes" column="classesid" /></class></hibernate-mapping>
总结:综上所述,其实不管一对多还是多对一,说的都是关系的维护端(关系在哪一端维护)。就好比最后的双向关联映射,通过设置两端,我即可以在一的一端加载多的一端,也可以在多的一端加载一的一端,只不过我们通常都会在一的一端设置
inverse="true",让关系维护在多的一端。