如何将Institute实体设为InstituteVerificationStatus的主键?报错求助
解决JPA中将关联实体作为主键的报错问题
你要把Institute实体作为InstituteVerificationStatus的主键,当前报错主要是两个原因:InstituteVerificationStatus缺少JPA要求的无参构造器,且未基于关联主键正确实现equals()和hashCode()方法。以下是具体修复方案:
1. 补充无参构造器
JPA规范强制要求实体必须有公共无参构造器,框架在实例化实体(比如从数据库加载数据)时会依赖该构造器。你的InstituteVerificationStatus目前只有带参构造器,需要补充。
2. 重写equals和hashCode方法
因为Institute作为主键实体,JPA需要通过这两个方法判断实体唯一性,必须基于Institute的主键字段(id)来实现逻辑。
修改后的InstituteVerificationStatus代码
@Entity @Table(name="InstituteVerificationStatus") public class instituteVerificationStatus implements Serializable { private static final long serialVersionUID = -1603576445855941895L; @Id @JoinColumn(name ="instituteId") @OneToOne private institute institute; @Column(name="verifiedByUserId") private String verifiedByUserId; @Column(name="status") private Character status; @Column(name="verificationTs") private Timestamp verificationTs; // 新增无参构造器 public instituteVerificationStatus() { } public instituteVerificationStatus(institute institute) { this.institute = institute; this.status='N'; } // 基于Institute的id实现equals @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; instituteVerificationStatus that = (instituteVerificationStatus) o; return Objects.equals(institute != null ? institute.getId() : null, that.institute != null ? that.institute.getId() : null); } // 基于Institute的id生成hashCode @Override public int hashCode() { return Objects.hash(institute != null ? institute.getId() : null); } // 原有getter/setter方法保留 public institute getInstitute() { return institute; } public void setInstitute(institute institute) { this.institute = institute; } public String getVerifiedByUserId() { return verifiedByUserId; } public void setVerifiedByUserId(String verifiedByUserId) { this.verifiedByUserId = verifiedByUserId; } public Character getStatus() { return status; } public void setStatus(Character status) { this.status = status; } public Timestamp getVerificationTs() { return verificationTs; } public void setVerificationTs(Timestamp verificationTs) { this.verificationTs = verificationTs; } }
额外注意事项
- 确保
Institute的id字段不会被修改,因为它作为InstituteVerificationStatus的主键,主键字段禁止更新。 - 两个实体已正确实现
Serializable接口,无需额外修改。
内容的提问来源于stack exchange,提问作者Aayush Saini
相关产品推荐
相关产品推荐

