一,前言
当我们为项目设计表的时候,有时候会需要用复合主键来标识唯一,若项目的持久层采用了hibernate框架,则可以使用@EmbeddedId注解来实现该需求。
二,表设计
CREATE TABLE `mkt_mas_cpcus` (
`CR_ORG_NBR` decimal(3,0) NOT NULL DEFAULT '0' COMMENT '机构号',
`CR_ACCT_NBR` decimal(16,0) NOT NULL DEFAULT '0' COMMENT '持卡人代号',
`CR_STATUS` decimal(1,0) DEFAULT NULL COMMENT '状态',
`CR_SHORT_NAME` varchar(15) DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`CR_ORG_NBR`,`CR_ACCT_NBR`)
)
该表中,机构号CR_ORG_NBR 和 持卡人代号CR_ACCT_NBR 作为复合主键,唯一标识一条数据。
三,创建复合主键类
@Embeddable
public class MasCpcusPK implements Serializable {
private static final long serialVersionUID = 1L;
private BigDecimal crAcctNbr; // 持卡人代号
private BigDecimal crOrgNbr; // 机构号
public MasCpcusPK() {
}
@Basic
@Column(name="CR_ACCT_NBR")
public BigDecimal getCrAcctNbr() {
return this.crAcctNbr;
}
public void setCrAcctNbr(BigDecimal crAcctNbr) {
this.crAcctNbr = crAcctNbr;
}
@Basic
@Column(name="CR_ORG_NBR")
public BigDecimal getCrOrgNbr() {
return this.crOrgNbr;
}
public void setCrOrgNbr(BigDecimal crOrgNbr) {
this.crOrgNbr = crOrgNbr;
}
}
四,创建po类,采用了hibernate注解
用复合主键代替那两个属性,在get方法上,加上@EmbeddedId注解。
@Entity
@Table(name = "mkt_mas_cpcus", schema = "market", catalog = "")
public class MktMasCpcus implements Serializable {
private static final long serialVersionUID = -8509123963537411929L;
private MasCpcusPK id; // 复合主键
private BigDecimal crStatus; // 客户状态
private String crShortName; // 姓名
@EmbeddedId
public MasCpcusPK getId() {
return id;
}
public void setId(MasCpcusPK id) {
this.id = id;
}
@Basic
@Column(name = "CR_STATUS")
public BigDecimal getCrStatus() {
return crStatus;
}
public void setCrStatus(BigDecimal crStatus) {
this.crStatus = crStatus;
}
@Basic
@Column(name = "CR_SHORT_NAME")
public String getCrShortName() {
return crShortName;
}
public void setCrShortName(String crShortName) {
this.crShortName = crShortName;
}
}
五,创建DAO层
由于是复合主键,那么泛型中的主键就要写这个复合主键MasCpcusPK。
public interface MktMasCpcusDao extends JpaRepository<MktMasCpcus, MasCpcusPK> {
}
若是要调用Dao层的接口,根据id查询的时候,id就要传MasCpcusPK。