您的位置:首页 > 其它

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

2012-05-28 08:39 435 查看
有的时候,我们设计表格,会出现多个字段的组合构成表的主键的情况,也就是复合主键。在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。剩下的就交给大家自己去学习了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: