Hibernate映射详解(七)--复合主键映射与Component映射
有的时候,我们设计表格,会出现多个字段的组合构成表的主键的情况,也就是复合主键。在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。剩下的就交给大家自己去学习了。