举个例子说明什么是组成关系,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>
这种嵌套根据实际需要使用,但是还是越少越好。