zoukankan      html  css  js  c++  java
  • 联合主键

    一:背景介绍

    在很多项目中,一个数据库表不仅仅只有一个约束条件,所以需要设置多个主键,来构成约束。但是在同时对多个主键进行增删改查的操作后,就难以下手了,所以需要引入联合主键的概念,将多个主键糅合归纳到一个主键中,从而方便相关操作的实行。

    二:具体操作

    不多说,直接先看数据库的结构:

    表的字段值:

    其主键为:

    在hibernate下,我们主要来看一下实体bean的配置,其他的具体CRUD操作此处不做编写:

    实体TpsControl类代码如下:
    package yspos.boss.urm.entity;
    
    import java.io.Serializable;
    
    import javax.persistence.AttributeOverride;
    import javax.persistence.AttributeOverrides;
    import javax.persistence.Column;
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    /**
     * Cmmtinorg entity. 
     */
    
    @Entity    -----------注解
    @Table(name = "TPS_CONTROL") ------------------对应的表名称
    public class TpsControl implements Serializable { --1.必须实现Serializable
    
        
        private static final long serialVersionUID = -202989070727685638L;
        
        private TpsControlId id;  ----------联合主键,可以映射到实体类TpsControlId
        private String ifControl;
        private Integer concurrentNumber;
        private Integer monthVisit;
        private String reqIp;
        private String remark;
        private Integer accNameLimit;
        
        
        public TpsControl() { ------必须有默认的 public无参数的构造方法
        }
    
        public TpsControl(TpsControlId id) {
            this.id = id;
        }
    
        public TpsControl(TpsControlId id,String ifControl, Integer concurrentNumber, Integer monthVisit,
                String reqIp, String remark, Integer accNameLimit) {
            this.id = id;
            this.ifControl = ifControl;
            this.concurrentNumber = concurrentNumber;
            this.monthVisit = monthVisit;
            this.reqIp = reqIp;
            this.remark = remark;
            this.accNameLimit = accNameLimit;
        }
    
        @EmbeddedId                      ---将嵌入式主键类使用 @Embeddable 标注,表示这个是一个嵌入式类
        @AttributeOverrides( {           ----------------@AttributeOverrides 属性映射
            @AttributeOverride(name = "src", column = @Column(name = "SRC", nullable = false, length = 5)),
            @AttributeOverride(name = "msgCode", column = @Column(name = "MSG_CODE", nullable = false, length = 20)),
            @AttributeOverride(name = "method", column = @Column(name = "METHOD", nullable = false, length = 30)) })
        public TpsControlId getId() {
            return id;
        }
        
        public void setId(TpsControlId id) {
            this.id = id;
        }
    
        @Column(name = "IF_CONTROL", length = 1)    -------对应于表字段的信息
        public String getIfControl() {
            return ifControl;
        }
    
    
        public void setIfControl(String ifControl) {
            this.ifControl = ifControl;
        }
    
        @Column(name = "CONCURRENT_NUMBER",  length = 10)
        public Integer getConcurrentNumber() {
            return concurrentNumber;
        }
    
    
        public void setConcurrentNumber(Integer concurrentNumber) {
            this.concurrentNumber = concurrentNumber;
        }
    
        @Column(name = "MONTH_VISIT", length = 20)
        public Integer getMonthVisit() {
            return monthVisit;
        }
    
    
        public void setMonthVisit(Integer monthVisit) {
            this.monthVisit = monthVisit;
        }
    
        @Column(name = "REQ_IP", length = 100)
        public String getReqIp() {
            return reqIp;
        }
    
    
        public void setReqIp(String reqIp) {
            this.reqIp = reqIp;
        }
    
        @Column(name = "REMARK", length = 100)
        public String getremark() {
            return remark;
        }
    
    
        public void setremark(String remark) {
            this.remark = remark;
        }
    
        @Column(name = "ACC_NAME_LIMIT", length = 10)
        public Integer getAccNameLimit() {
            return accNameLimit;
        }
    
    
        public void setAccNameLimit(Integer accNameLimit) {
            this.accNameLimit = accNameLimit;
        }
    }

    联合主键类:

    实体TpsControlId类如下:
    package yspos.boss.urm.entity;
    
    import javax.persistence.Column;
    
    import yspos.boss.cmmt.entity.CmmtcityId;
    
    public class TpsControlId implements java.io.Serializable {
        private static final long serialVersionUID = 2719054247718051949L;
        
        private String src;
        private String msgCode;
        private String method;
        
        
        public TpsControlId() {
        }
    
    
        public TpsControlId(String src, String msgCode, String method) {
            super();
            this.src = src;
            this.msgCode = msgCode;
            this.method = method;
        }
    
    
        @Column(name = "SRC", nullable = false, length = 5)
        public String getSrc() {
            return src;
        }
    
    
        public void setSrc(String src) {
            this.src = src;
        }
    
    
        @Column(name = "MSG_CODE", nullable = false, length = 20)
        public String getMsgCode() {
            return msgCode;
        }
    
    
        public void setMsgCode(String msgCode) {
            this.msgCode = msgCode;
        }
    
    
        @Column(name = "METHOD", nullable = false, length = 30)
        public String getMethod() {
            return method;
        }
    
    
        public void setMethod(String method) {
            this.method = method;
        }
        
        
        public boolean equals(Object other) {      ---必须覆盖 equals和 hashCode 方法
            if ((this == other))
                return true;
            if ((other == null))
                return false;
            if (!(other instanceof TpsControlId))
                return false;
            TpsControlId castOther = (TpsControlId) other;
    
            return ((this.getSrc() == castOther.getSrc()) || (this
                    .getSrc() != null
                    && castOther.getSrc() != null && this.getSrc().equals(
                    castOther.getSrc())))
                    && ((this.getMsgCode() == castOther.getMsgCode()) || (this
                            .getMsgCode() != null
                            && castOther.getMsgCode() != null && this.getMsgCode()
                            .equals(castOther.getMsgCode())))
                    && ((this.getMethod() == castOther.getMethod()) || (this
                            .getMethod() != null
                            && castOther.getMethod() != null && this.getMethod()
                            .equals(castOther.getMethod())));
        }
        
        public int hashCode() {
            int result = 17;
    
            result = 37 * result
                    + (getSrc() == null ? 0 : this.getSrc().hashCode());
            result = 37 * result
                    + (getMsgCode() == null ? 0 : this.getMsgCode().hashCode());
            result = 37 * result
                    + (getMethod() == null ? 0 : this.getMethod().hashCode());
            return result;
        }
    
    }

    符合条件: 

    *         1.必须实现Serializable

     *        2.必须有默认的 public无参数的构造方法、必须覆盖 equals和 hashCode 方法,这些要求与使用复合主键的要求相同

     *        3.将嵌入式主键类使用 @Embeddable 标注,表示这个是一个嵌入式类。

     

    --->如果要求一个类要去实现Serializable,往往表示这个类的实例要进行网络传输,从A系统传到B系统,以字节形式传输,到达B后再把这些字节恢复成对象;

    --->equals和hashCode两个方法常用哈希算法相关,比如要把对象放入TreeSet容器里,就需要容器里元素对应的类要重写equals和hashCode方法,因为TreeSet背后使用了哈希算法和哈希表。 

  • 相关阅读:
    orm 锁 和 事务
    多表查询
    django 单表查询
    djgango装饰器
    几个SQL命令的使用
    怎么成为优秀的软件模型设计者?
    jbpm 工作流(二)
    Jbpm工作流(一)
    EJB 介绍
    JNDI 使用
  • 原文地址:https://www.cnblogs.com/1987721594zy/p/9168891.html
Copyright © 2011-2022 走看看