spring 使用注解来定义联合主键

Hibernate注解规范的文档中提供了三种方法:
     1. 将组件类注解为@Embeddable,并将组件的属性注解为@Id;
     2. 将组件的属性注解为@Embeddable;
     3. 将类注解为@IdClass,并将该实体中所有主键属性注解为@Id。
这里,我采用的是第三种方法——@IdClass,下面就是具体的代码,大家一块讨论一下。


       首先,需要说明的是,采用@IdClass方式,需要根据所有的主键属性,建立一个主键类,该主键类包含所有的主键,而且,作为主键类,需要满足以下要求:
    1. 主键类必须实现序列化接口(implements Serializable);
    2. 主键类必须有默认的public无参数的构造方法;

    3. 主键类必须覆盖equals和hashCode方法。

CREATE TABLE `bbpgbmx` (
`bbpgbid` INT(11) NOT NULL,
`pgbbh` VARCHAR(50) NOT NULL COMMENT '编号',
`mxxh` INT(11) NOT NULL COMMENT '明细序号',
`xh` VARCHAR(10) NOT NULL COMMENT '序号',
`nr` VARCHAR(100) NULL DEFAULT NULL COMMENT '内容',
`fs` INT(11) NULL DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`bbpgbid`, `pgbbh`, `mxxh`, `xh`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;



import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity
@Table(name = "bbpgbmx")
@JsonIgnoreProperties(ignoreUnknown=true)
public class Bbpgbmx extends ReponseModel{
	
	@EmbeddedId
    private BbpgbmxId id;
	
	private String nr;
	
	private Integer fs;
	
	
	
	public Bbpgbmx() {
		super();
	}

	public Bbpgbmx(Long bbpgbid, String pgbbh, Integer mxxh, String xh) {
		this.id =new BbpgbmxId(bbpgbid,pgbbh,mxxh,xh);
	}

	public BbpgbmxId getId() {
		return id;
	}

	public void setId(BbpgbmxId id) {
		this.id = id;
	}


	public String getNr() {
		return nr;
	}

	public void setNr(String nr) {
		this.nr = nr;
	}

	public Integer getFs() {
		return fs;
	}

	public void setFs(Integer fs) {
		this.fs = fs;
	}

	

	
}


import java.io.Serializable;

import javax.persistence.Embeddable;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

/**
 * 
 * @Description:     
		Hibernate注解规范的文档中提供了三种方法:
     1. 将组件类注解为@Embeddable,并将组件的属性注解为@Id;
     2. 将组件的属性注解为@Embeddable;
     3. 将类注解为@IdClass,并将该实体中所有主键属性注解为@Id。
这里,我采用的是第三种方法——@IdClass,下面就是具体的代码,大家一块讨论一下。

       首先,需要说明的是,采用@IdClass方式,需要根据所有的主键属性,建立一个主键类,该主键类包含所有的主键,而且,作为主键类,需要满足以下要求:
    1. 主键类必须实现序列化接口(implements Serializable);
    2. 主键类必须有默认的public无参数的构造方法;
    3. 主键类必须覆盖equals和hashCode方法。
 */

@JsonIgnoreProperties(ignoreUnknown=true)
@Embeddable  //embeddable: 可嵌入的
public class BbpgbmxId implements Serializable{
	
	private Long bbpgbid;
	
	private String pgbbh;
	
	private Integer mxxh;
	
	private String xh;
	
	/** 
     * 无参数的public构造方法,必须要有 
     */ 
	public BbpgbmxId() {
		super();
	}
	

	public BbpgbmxId(Long bbpgbid, String pgbbh, Integer mxxh, String xh) {
		this.bbpgbid = bbpgbid;
		this.pgbbh = pgbbh;
		this.mxxh = mxxh;
		this.xh = xh;
	}



	public Long getBbpgbid() {
		return bbpgbid;
	}

	public void setBbpgbid(Long bbpgbid) {
		this.bbpgbid = bbpgbid;
	}

	public String getPgbbh() {
		return pgbbh;
	}

	public void setPgbbh(String pgbbh) {
		this.pgbbh = pgbbh;
	}

	public Integer getMxxh() {
		return mxxh;
	}

	public void setMxxh(Integer mxxh) {
		this.mxxh = mxxh;
	}

	public String getXh() {
		return xh;
	}

	public void setXh(String xh) {
		this.xh = xh;
	}
	
	/** 
     * 覆盖hashCode方法,必须要有 
     */  
    @Override  
    public int hashCode() {  
        final int PRIME = 31;  
        int result = 1;  
        result = PRIME * result + (bbpgbid == null ? 0 : bbpgbid.hashCode());  
        result = PRIME * result + (pgbbh == null ? 0 : pgbbh.hashCode());  
        result = PRIME * result + (mxxh == null ? 0 : mxxh.hashCode());  
        result = PRIME * result + (xh == null ? 0 : xh.hashCode());  
        return result;  
    }

	 
  
    /** 
     * 覆盖equals方法,必须要有 
     */  
    @Override
	public boolean equals(Object obj) {
    	if(obj == null) 
    		return false;
    	if(getClass() != obj.getClass())
    		return false;
    	final BbpgbmxId other = (BbpgbmxId) obj;
    	if(bbpgbid == null){
    		if(other.bbpgbid != null){
    			return false;
    		}
    	}else if(!bbpgbid.equals(other.bbpgbid)){
    		return false;
    	}
    	if(pgbbh == null){
    		if(other.pgbbh != null){
    			return false;
    		}
    	}else if(!pgbbh.equals(other.pgbbh)){
    		return false;
    	}
    	if(mxxh == null){
    		if(other.mxxh != null){
    			return false;
    		}
    	}else if(!mxxh.equals(other.mxxh)){
    		return false;
    	}
    	if(xh == null){
    		if(other.xh != null){
    			return false;
    		}
    	}else if(!xh.equals(other.xh)){
    		return false;
    	}
		return true;
	} 
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值