【Hibernate】复合主键映射

来源:互联网 发布:淘宝公安警用皮带 编辑:程序博客网 时间:2024/06/05 07:37

    上篇博客介绍了 继承映射,这篇博客介绍一下复合主键映射,我们在日常开发中经常遇到这样一种情况,数据库中的某张表需要多个字段列才能唯一确定一行记录,这时需要使用复合主键。


复合主键映射需要在映射配置文件中使用<composite-id>标签,该标签是指将一个类指定为相应的复合主键,它的name属性需要指定类文件中定义的属性值,并在该标签中添加<key-property>子标签。并且需要将复合主键放到一个类中,将这个类和其它属性放到一个类中,复合主键的类必须要实现接口Serializable.


复合主键映射的例子:

年限和持续时间两个共同作为主键


一、类文件

因为年限和持续时间两个共同作为主键,所以年限和持续时间被封装成一个类FiscalYearPeriodPK,FiscalYearPeriod类封装其它属性以及FiscalYearPeriodPK类。

FiscalYearPeriodPK.java:

public class FiscalYearPeriodPK implements Serializable {//核算年private int fiscalYear;//核算月private int fiscalPeriod;public int getFiscalYear() {return fiscalYear;}public void setFiscalYear(int fiscalYear) {this.fiscalYear = fiscalYear;}public int getFiscalPeriod() {return fiscalPeriod;}public void setFiscalPeriod(int fiscalPeriod) {this.fiscalPeriod = fiscalPeriod;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + fiscalPeriod;result = prime * result + fiscalYear;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;final FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj;if (fiscalPeriod != other.fiscalPeriod)return false;if (fiscalYear != other.fiscalYear)return false;return true;}}
FiscalYearPeriod.java:

public class FiscalYearPeriod {private FiscalYearPeriodPK fiscalYearPeriodPK;//开始日期private Date beginDate;//结束日期private Date endDate;//状态private String periodSts;public Date getBeginDate() {return beginDate;}public void setBeginDate(Date beginDate) {this.beginDate = beginDate;}public Date getEndDate() {return endDate;}public void setEndDate(Date endDate) {this.endDate = endDate;}public String getPeriodSts() {return periodSts;}public void setPeriodSts(String periodSts) {this.periodSts = periodSts;}public FiscalYearPeriodPK getFiscalYearPeriodPK() {return fiscalYearPeriodPK;}public void setFiscalYearPeriodPK(FiscalYearPeriodPK fiscalYearPeriodPK) {this.fiscalYearPeriodPK = fiscalYearPeriodPK;}}
二、配置文件

FiscalYearPeriod.hbm.xml:

<hibernate-mapping><class name="com.hibernate.FiscalYearPeriod" table="t_fiscal_year_period"><composite-id name="fiscalYearPeriodPK"><key-property name="fiscalYear"/><key-property name="fiscalPeriod"/></composite-id><property name="beginDate" type="date"/><property name="endDate" type="date"/><property name="periodSts"/></class></hibernate-mapping>


小结:

    现在我们很少使用到这种复合主键了,因为考虑到数据库的优化,常常会把复合主键拆分到两个表中,并利用一个关系表来维护两个表的关系,关系表中不添加主键。

0 0