有的時候,我們設計表格,會出現多個字段的組合構成表的主鍵的情況,也就是複合主鍵。在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。剩下的就交給大家自己去學習了。