在上一篇【SSH】——Hibernate(3)实体映射中,已经提到了,ORM功能的实现,主要文件有映射类(*.java),映射文件(*.hbm.xml)和配置文件(*.property/.cfg.xml)。接下来通过三个文件,对映射类的实现进行分析。
关联映射主要分为两大类:单向关联和双向关联。今天主要说一下单向关联。
一)一对一关联映射
两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)
有两种策略可以实现一对一的关联映射:
*主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:
Hbm.xml配置文件:
<hibernate-mapping>
<class name="com.example.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.hibernate.User" table="t_person">
<id name="id">
<!-- 采用foreign生成策略,它会取得关联对象的标识 -->
<generator class="foreign">
<!-- property 指的是关联的对象 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true" />
</class>
</hibernate-mapping>
Hbm.xml文件配置:
<hibernate-mapping>
<class name="com.example.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<!-- property指关联对象 -->
<property name="name"/>
<!-- 默认参考idCard的主键-->
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
二)多对一关联映射
用户和组是多对一的关系。一个组有多个用户,一个用户只属于一个组。有了ER图知识的积累,我们知道多对一的关联映射策略一定是在多的一端加入一个外键,指向一的一端。
Hbm.xml文件配置:
<hibernate-mapping>
<classname="com.bjpowernode.hibernate.User"table="t_user">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<many-to-one name="group"column="groupid"cascade="save-update"/>
</class>
</hibernate-mapping>
三)一对多关联映射(***)
班级和学生是一对多的关系。一个班级有多个学生,一个学生只能属于一个班。在多的一端加入一一端的主键当做外键。这样的冗余是最少的。
hbm.xml文件配置:
在一的一端加入标签映射
<hibernate-mapping>
<classname="com.bjpowernode.hibernate.Group"table="t_group">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<set name=”users”>
<key column=”groupId”/>
<one-to-many class="com.bjpowernode.hibernate.User">
</set>
</class>
</hibernate-mapping>
我们采用的是在一的一端维护关系。这样的话,多的一端并不知道一的一端的存在。也就是说学生并不知道班级的存在。
四)多对多关联映射
用户和角色的关系。一个用户可以有多个角色,一个角色可以有多个用户。 n:n的关系,一定会有一张第三张表来维护他们的关系。
如果是user单向对role 那么则在user的一端加入标签映射。
hbm.xml文件配置:
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.hibernate.Role" column="role_id"/>
</set>