举个例子说明什么是组成关系,Person类和Hand类。当Person消失后,Hand自然就没有意义了,也应该随之消失。换句话说,组成关系就是[部分类]对象生命周期依赖于[整体类]对象的生命周期,当[整体类]消失时,[部分类]也随即消失。这种关系也叫聚集关系。

 
什么时候需要映射组成关系?
如:Customer类和Address类。
Customer类有属性:id,name,homeAddress,compAddress.
Address类有属性:province,city,street,customer
在DB中,为了尽量减少表的数量,没有必要创建一个ADDRESSES表的时候,使用组成关系映射最为合适了。此时,需要在CUSTOMERS表中,设置如下字段:
ID,NAME,HOME_PROVINCE,HOME_CITY,HOME_STREET,COMP_PROVINCE,COMP_CITY,COMP_STREET.
当然在决定DB结构的时候,我们是必须在空间和时间做一个折中考虑的。以上这种设计就是出于效率考虑的,如果是出于结构考虑的话,还是应该有一个ADDRESSES表存在为好。
 
如何配置MappingXML?
对于Customer类的name属性,仍用<property>,但是对于homeAddress和compAddress属性则需要使用<component>元素了。如下:
<hibernate-mapping package="com.wjb.mypack">
    <class name="Customer" table="CUSTOMERS">
        <id name="id" type="long" column="ID">
            <generator class="native">
        </id>
        <property name="name" type="string"/>
        <component name="homeAddress" class="Address">
            <parent name="customer"/>
            <property name="province" column="HOME_PROVINCE">
            <property name="city" column="HOME_CITY">
            <property name="street" column="HOME_STREET"> 
        </component>
        <component name="compAddress" class="Address">
            <parent name="customer"/>
            <property name="province" column="COMP_PROVINCE">
            <property name="city" column="COMP_CITY">
            <property name="street" column="COMP_STREET"> 
        </component>
    </class>
</hibernate>
以上类中的<component>中有<parent>和<property>,其中<parent>用来配置组件类所属的整体类。Hibernate将根据这个属性来决定组件类的生命周期。
 
复合组成关系的映射
Hibernate支持复合组成关系的映射,所谓复合就是<component>元素的嵌套使用。
<component name="homeAddress" class="Address">
    <parent name="customer"/>
    <property name="province" column="HOME_PROVINCE">
    <property name="city" column="HOME_CITY">
    <property name="street" column="HOME_STREET"> 
    <component name="communication" class="Communication">
        <parent name="address"/>
        <property name="zoneNumber" column="HOME_ZONE_PHONENO">
        <property name="detailNumber" column="HOME_DETAIL_PHONENO">
    </component>
</component>
这种嵌套根据实际需要使用,但是还是越少越好。