复合主键(联合主键):多个字段构成唯一性。
实例场景:核算期间
// 核算期间 public class FiscalYearPeriod { private int fiscalYear; //核算年 private int fiscalPeriod; //核算月 private Date beginDate; //开始日期 private Date endDate; //结束日期 private String periodSts; //状态 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; } 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; } }
复合主键的映射,一般情况把主键相关的属性抽取出来单独放入一个类中。而这个类是有要求的:必需实现序列化接口(java.io.Serializable)(可以保存到磁盘上),为了确定这个复合主键类所对应对象的唯一性就会产生比较,对象比较就需要复写对象的hashCode()、equals()方法(复写方法如下图片),然后在类中引用这个复合主键类
复合主键类:
public class FiscalYearPeriodPK implements java.io.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; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + fiscalPeriod; result = prime * result + fiscalYear; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj; if (fiscalPeriod != other.fiscalPeriod) return false; if (fiscalYear != other.fiscalYear) return false; return true; } }
实体类:(中引用了复合主键类)
public class FiscalYearPeriod { private FiscalYearPeriodPK fiscalYearPeriodPK;//引用 复合主键类 private Date beginDate;//开始日期 private Date endDate;//结束日期 private String periodSts;//状态 public FiscalYearPeriodPK getFiscalYearPeriodPK() { return fiscalYearPeriodPK; } public void setFiscalYearPeriodPK(FiscalYearPeriodPK fiscalYearPeriodPK) { this.fiscalYearPeriodPK = fiscalYearPeriodPK; } ………………
导出数据库输出SQL语句:
create table t_fiscalYearPeriod (fiscalYear integer not null, fiscalPeriod integer not null, beginDate datetime, endDate datetime, periodSts varchar(255), primary key (fiscalYear, fiscalPeriod))//实体映射到数据就是两个字段构成复合主键 |
复合主键关联映射数据存储:
session = HibernateUtils.getSession(); tx = session.beginTransaction(); FiscalYearPeriod fiscalYearPeriod = new FiscalYearPeriod(); //构造复合主键 FiscalYearPeriodPK pk = new FiscalYearPeriodPK(); pk.setFiscalYear(2009); pk.setFiscalPeriod(11); fiscalYearPeriod.setFiscalYearPeriodPK(pk);//为对象设置复合主键 fiscalYearPeriod.setEndDate(new Date()); fiscalYearPeriod.setBeginDate(new Date()); fiscalYearPeriod.setPeriodSts("Y"); session.save(fiscalYearPeriod);
执行输出SQL语句:
Hibernate: insert into t_fiscalYearPeriod (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) |
注:如果再存入相同复合主键的记录,就会出错。
数据的加载:
数据加载非常简单,只是主键是一个对象而以,不是一个普通属性。