023 复合主键 关联映射

复合主键(联合主键):多个字段构成唯一性。

 

    实例场景:核算期间

// 核算期间

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 (?, ?, ?, ?, ?)

注:如果再存入相同复合主键的记录,就会出错。

数据的加载:

    数据加载非常简单,只是主键是一个对象而以,不是一个普通属性。

 

posted @ 2014-11-07 10:02  crazyYong  阅读(432)  评论(0编辑  收藏  举报