今天用Jpa操作数据库的时候,有一个类在数据库存放并非一个主键确定一条数据,因为有若干数据有一个主键,去网上查阅了相关资料,发现了一个比较好用的方法是使用复合主键,大概意思就是一个类有多个主键来确定一条数据。
复合类
复合类继承Serializable,其中number和awardName确定唯一数据。
package com.evaluation.system.domain;
import java.io.Serializable;
import java.util.Objects;
public class AwardPK implements Serializable {
private String number;
private String awardName;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AwardPK awardPK = (AwardPK) o;
return number.equals(awardPK.number) &&
awardName.equals(awardPK.awardName);
}
@Override
public int hashCode() {
return Objects.hash(number, awardName);
}
public AwardPK() {
}
public AwardPK(String number, String awardName) {
this.number = number;
this.awardName = awardName;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getAwardName() {
return awardName;
}
public void setAwardName(String awardName) {
this.awardName = awardName;
}
}
Award
引入@IdClass(AwardPK.class)
多个主键@Id
package com.evaluation.system.domain;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import java.io.Serializable;
@Entity
@Data
@IdClass(AwardPK.class)
public class Award implements Serializable {
// 学号,主键
@Id
@Column(name = "number")
private String number;
// 姓名
private String name;
// 获奖类型
private String type;
// 奖项名称,复合主键
@Id
@Column(name = "awardName")
private String awardName;
// 加分数
private int score;
// 班级
private String classMajor;
public Award() {
}
public Award(String number, String name, String type, String awardName, int score, String classMajor) {
this.number = number;
this.name = name;
this.type = type;
this.awardName = awardName;
this.score = score;
this.classMajor = classMajor;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAwardName() {
return awardName;
}
public void setAwardName(String awardName) {
this.awardName = awardName;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getClassMajor() {
return classMajor;
}
public void setClassMajor(String classMajor) {
this.classMajor = classMajor;
}
@Override
public String toString() {
return "AwardTemp{" +
"number='" + number + '\'' +
", name='" + name + '\'' +
", type='" + type + '\'' +
", awardName='" + awardName + '\'' +
", score=" + score +
", classMajor='" + classMajor + '\'' +
'}';
}
}
AwardTemp
package com.evaluation.system.domain;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import java.io.Serializable;
@Entity
@Data
@IdClass(AwardPK.class)
public class AwardTemp implements Serializable {
// 学号,主键
@Id
@Column(name = "number")
private String number;
// 姓名
private String name;
// 获奖类型
private String type;
// 奖项名称,复合主键
@Id
@Column(name="awardName")
private String awardName;
// 加分数
private int score;
// 审核结果
private String judge;
// 驳回理由
private String reason;
// 班级
private String classMajor;
public AwardTemp() {
}
public AwardTemp(String number, String name, String type, String awardName, int score, String classMajor) {
this.number = number;
this.name = name;
this.type = type;
this.awardName = awardName;
this.score = score;
this.classMajor = classMajor;
}
public AwardTemp(String number, String name, String type, String awardName, int score, String judge, String reason, String classMajor) {
this.number = number;
this.name = name;
this.type = type;
this.awardName = awardName;
this.score = score;
this.judge = judge;
this.reason = reason;
this.classMajor = classMajor;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAwardName() {
return awardName;
}
public void setAwardName(String awardName) {
this.awardName = awardName;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getJudge() {
return judge;
}
public void setJudge(String judge) {
this.judge = judge;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public String getClassMajor() {
return classMajor;
}
public void setClassMajor(String classMajor) {
this.classMajor = classMajor;
}
@Override
public String toString() {
return "AwardTemp{" +
"number='" + number + '\'' +
", name='" + name + '\'' +
", type='" + type + '\'' +
", awardName='" + awardName + '\'' +
", score=" + score +
", judge='" + judge + '\'' +
", reason='" + reason + '\'' +
", classMajor='" + classMajor + '\'' +
'}';
}
}