数据库|Spring·JPA设置复合主键
原创
©著作权归作者所有:来自51CTO博客作者算法与编程之美的原创作品,请联系作者获取转载授权,否则将追究法律责任
通常在一些多对多的实体中,会出现联合主键。就比如说在课程和学生之间,一门课程可以被多个学生所选,而一个学生可以选择多门课程。这时我们一般会在数据库中建立一张“学生-课程”表用来表示学生和课程之间多对多的关系。除了联合主键,有些表中也会出现复合主键,因为某一个字段不能满足其唯一性。比如学生表:姓名、年级、性别等字段都有可能重复。所以需要将多个字段同时设置为主键。
那么在SpringJPA中如何实现这种关系呢?
首先我们需要建立“学生-课程”这一实体。(省略构造函数、getter、setter)
@Entity @Table(name = "t_course") public class Tcourse implements Serializable { private String tno; private String cno;
}
|
建立联合主键类,该类必须是可序列化的,并且必须包含一个空的构造函数,需要重写equals和hashCode方法。其字段或属性的类型和名称必须与使用@Id的实体字段相对应。代码如下:
public class TCoursePK implements Serializable { private String tno; private String cno; public TCoursePK() { } public TCoursePK(String tno, String cno) { this.tno = tno; this.cno = cno; } @Override public boolean equals(Object o){ if(this==o) return true; if(o==null || getClass()!=o.getClass()) return false; TCoursePK that = (TCoursePK) o; return Objects.equals(tno,that.tno)&&Objects.equals(cno,that.cno); } @Override public int hashCode(){ return Objects.hash(tno,cno); } public String getTno() { return tno; } public void setTno(String tno) { this.tno = tno; } public String getCno() { return cno; } public void setCno(String cno) { this.cno = cno; } }
|
最后,只需要在实体类是联合主键的字段都加上@Id注解,
并且该实体加上@IdClass(TCoursePK.class)。
@Entity @Table(name = "t_course") @IdClass(TCoursePK.class) public class Tcourse implements Serializable { @Id private String tno; @Id private String cno;
}
|
END