zoukankan      html  css  js  c++  java
  • 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 (?, ?, ?, ?, ?)

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

    数据的加载:

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

  • 相关阅读:
    Java高并发学习笔记(四):volatile关键字
    Java高并发学习笔记(三):类加载
    Java高并发学习笔记(二):线程安全与ThreadGroup
    解决druid在OpenJDK11+Gradle中的依赖问题
    解决AUR无法正常升级WebStorm2021.1.1的问题
    论软件体系架构之质量属性
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    软件架构师如何工作
    泰坦尼克号数据分析
    当当网图书数据爬取和清洗
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4080524.html
Copyright © 2011-2022 走看看