多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同
1.多对一(下面示例人员表(Info),民族表(Nation)) 多个人员对应一个民族。要知道,人员表中的外键列nation是对应民族表的主键列code。所以要在Info.hbm.xml中配置nation外键指向民族表。(如下图所示)
一般需要加上cascade="save-update",加这个配置业属性目的是,many表和one表一起更新
2.一对多(下面以人员表(Info)和工作简历(Work)表为例)每个人员对应个工作简历。
首先需要在Info的实体类中加入一个Set<Work> 类型的字段。
然后再Info.hbm.xml中配置一对多。(如下图所示)
<set name="实体类中集合成员的变量名(works)"> <one-to-many class="Work表"> <key> <column name="InfoCode" ></colum> </key> </set>
3.一对一(人员表与密码表)每个人对应相应的用户密码:(因为外键值设置在login表上,所以在login.hbm.xml中配置信息)
4.多对多
数据库中没有多对多的关系。只有程序里面有。数据库中是使用两个一对多和多对一来实现多对多的。典型的是:中间表
在程序中,如果中间表中没有其它信息,那就可以不用写中间表的实体类。
多对多,还可以用在:用户和角色的关系上。
1.给类加关联对象(集合对象)
2.给hbm.xml配置
<set name="当前类的集合属性" table="中间表"> <key column="中间表中与此表对应的外键"></key> <many-to-many class="另外多方对象的类名" column="另外多方对象在中间表中的外键"></many-to-many> </set> <set name="courses" table="score"> <key column="sno"></key> <many-to-many class="Course" column="cno"></many-to-many> </set>
(双向)
双向多对一关联 是最常见的关联关系。(这也是标准的父/子关联关系。)
<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" not-null="true"/> </class> <class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <set name="people" inverse="true"> <key column="addressId"/> <one-to-many class="Person"/> </set> </class>
基于外键关联的双向一对一关联也很常见。
<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" unique="true" not-null="true"/> </class> <class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <one-to-one name="person" property-ref="address"/> </class>