您的位置:首页 > 其它

Hibernate映射详解(七)--复合主键映射与Component映射

2012-05-28 08:39 441 查看
        有的时候,我们设计表格,会出现多个字段的组合构成表的主键的情况,也就是复合主键。在hibernate也提供了这种主键的实现方式。我们看一个例子。在核算期间中我们把核算年以及核算月作为主键。我们该怎么实现呢?首先,我们先把要组合成主键的字段放到一个单独的类中,但是仅这样是不够的,我们还需要实现序列化接口以及符合equals和hascode方法。代码展示如下。

public classFiscalYearPeriodPKimplements
Serializable {
    //核算年
    privateintfiscalYear;
    //核算月
    privateintfiscalPeriod;

     …省略get,set方法

     publicinthashCode() {
        finalint prime = 31;
        int result = 1;
        result = prime * result +fiscalPeriod;
        result = prime * result +fiscalYear;
        return result;
    }
    @Override
    publicbooleanequals(Object obj) {
        if (this == obj)
            returntrue;
        if (obj ==null)
            returnfalse;
        if (getClass() != obj.getClass())
            returnfalse;
        final FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj;
        if (fiscalPeriod != other.fiscalPeriod)
            returnfalse;
        if (fiscalYear != other.fiscalYear)
            returnfalse;
        returntrue;
    }

}

此两个字段组成核算期间的主键

publicclass FiscalYearPeriod {
    private FiscalYearPeriodPKfiscalYearPeriodPK;
//主键
    //开始日期
    private DatebeginDate;
    //结束日期
    private DateendDate;
    //状态
    private StringperiodSts;

    …省略get,set方法

}

对应的映射文件为:

<hibernate-mapping>
    <classname="com.bjpowernode.hibernate.FiscalYearPeriod"table="t_fiscal_year_period">
        <composite-idname="fiscalYearPeriodPK">
           
<key-propertyname="fiscalYear"/>

           
<key-propertyname="fiscalPeriod"/>

       
</composite-id>

        <propertyname="beginDate"type="date"/>
        <propertyname="endDate"type="date"/>
        <propertyname="periodSts"/>
    </class>
</hibernate-mapping>

 

接下来,我们简短的介绍一下组件映射和集合映射。

组件映射实体关系图为:

 


生成的表格为:

 


 

具体的代码实现为:

public class Contact {
 
    private Stringemail;
   
    private Stringaddress;
   
    private StringzipCode;
   
    privateStringcontactTel;
     …省略get,set方法
}
public class Employee {
 
    privateintid;
   
    private Stringname;
   
    private ContactemployeeContact;
      …省略get,set方法

}

public class User {
   
    privateintid;
   
    private Stringname;
   
    privateContactuserContact;
     …省略get,set方法

}

 

看一下相应的配置文件

Employee.hbm.xml
<hibernate-mapping>
    <classname="com.bjpowernode.hibernate.Employee"table="t_emplyee">
        <idname="id">
            <generatorclass="native"/>
        </id>
        <propertyname="name"/>
       <componentname="employeeContact">
           <propertyname="email"/>
           <propertyname="address"/>
           <propertyname="zipCode"/>
           <propertyname="contactTel"/>
       </component>
    </class>
</hibernate-mapping>

User.hbm.xml
<hibernate-mapping>
    <classname="com.bjpowernode.hibernate.User"table="t_user">
        <idname="id">
            <generatorclass="native"/>
        </id>
        <propertyname="name"/>
       <componentname="userContact">
           <propertyname="email"/>
           <propertyname="address"/>
           <propertyname="zipCode"/>
           <propertyname="contactTel"/>
       </component>
    </class>
</hibernate-mapping>

不多做解释,最后一个映射,集合映射生成表之间的关系

 


 

实体类实现:

public class CollectionMapping {
 
    privateintid;
   
    private Stringname;
   
    privateSetsetValues =newHashSet();
   
    privateListlistValues =newArrayList();
   
    private String[]arrayValues;
   
    privateMapmapValues;

     省略get,set方法

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对应的配置文件

<hibernate-mapping>
    <classname="com.bjpowernode.hibernate.CollectionMapping"table="t_collection_mapping">
        <idname="id">
            <generatorclass="native"/>
        </id>
        <propertyname="name"/>
        <setname="setValues"table="t_set_values">
            <keycolumn="set_id"/>
            <elementtype="string"column="set_value"not-null="true"/>
            <!--
            <composite-element class=""></composite-element>
             -->
        </set>
        <listname="listValues"table="t_list_values">
            <keycolumn="list_id"/>
            <list-indexcolumn="list_index"/>
            <elementtype="string"column="list_value"/>
        </list>
        <arrayname="arrayValues"table="t_array_values">
             <keycolumn="array_id"/>
             <list-indexcolumn="array_index"/>
             <elementtype="string"column="array_value"/>
        </array>
        <mapname="mapValues"table="t_map_values">
            <keycolumn="map_id"/>
            <map-keytype="string"column="map_key"/>
            <elementtype="string"column="map_value"/>
        </map>
    </class>
</hibernate-mapping>

        到现在为止,所有的映射都已经介绍完了。介绍完映射,我们已经可以初步的使用hibernate框架了。但是要想效率高,还需要进一步的学习。如缓存,抓取。实现映射,除了映射文件外,还有一种简单的方法可以实现这种功能,jpa。剩下的就交给大家自己去学习了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息