在上一篇文章【SSH】——Hibernate(4)关联映射之单项映射中,介绍了关联映射的单向映射,今天通过hbm.xml配置文件来介绍一下关联映射的双向映射。
双向一对一唯一外键映射关键映射代码——在IdCard端新加入如下标签映射:
采用<one - to-one>标签映射,并需指定其中的property-ref属性为关系字段的名称。
在一的一端的集合上采用标签,并用标签。在多的一端加入一个外键,同时在多的一端采用标签。
Hbm.xml文件配置:
student(多的一端)
PS:inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效。inverse是控制方向上的反转,只影响存储。
两端都添加 many-to-many>的标签映射。不过要注意,两端生成的中间表名称和字段都必须一致。
总结:
在上篇文章中,已经谈到单向的关联映射,可以和本文的双向关联映射对比,在实际应用中选择合适的策略
一)一对一关联映射
对比单向一对一映射,需要在IdCard加入<one-to-one>标签,它不影响,只影响加载。如下图:
双向一对一主键映射关键映射代码——在IdCard端新加入如下标签映射:
<one-to-one name="person"/>
双向一对一唯一外键映射关键映射代码——在IdCard端新加入如下标签映射:
采用<one - to-one>标签映射,并需指定其中的property-ref属性为关系字段的名称。
<one-to-one name="person"property-ref="idCard"/>
二)多对一关联映射
该映射主要是为了解决一对多单向关联的缺陷,并非业务需求导致的。在一的一端的集合上采用标签,并用标签。在多的一端加入一个外键,同时在多的一端采用标签。
Hbm.xml文件配置:
student(多的一端)
<many-to-one name="classes" column="classesid"/>
<set name="students"inverse="true">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set>
PS:inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效。inverse是控制方向上的反转,只影响存储。
三)多对多关联映射
在实际中到底是采用单向映射还是采用双向映射都是根据具体的需求,看是不是需要从一端把另一端加载出来,同时也从另一端把对方加载出来。两端都添加 many-to-many>的标签映射。不过要注意,两端生成的中间表名称和字段都必须一致。
Hbm.xml文件配置:
role端:
<set name="users" table="t_user_role">
<key column="role_id"/>
<many-to-many class="com.hibernate.User" column="user_id"/>
</set>
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com. hibernate.Role" column="role_id"/>
</set>
总结:
在上篇文章中,已经谈到单向的关联映射,可以和本文的双向关联映射对比,在实际应用中选择合适的策略