联合主键与Spring jpa
联合主键:
就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。适用于例如关系表这种多对多的场景。
语句:alter table 表名 add primary key (字段1,字段2,字段3);
spring jpa 如何使用联合主键:
例子:name和idcardno共同组成了主键
name idcardno age addresss
张三 12 3 地址
一、Spring Data Jpa 复合主键
1.1、编写一个复合主键类:PeopleKey
@Embeddable public class PeopleKey implements Serializable { @Column(name = "name") private String name; @Column(name = "idcardno") private String idcardno; // 省略setter,getter方法 @Override public String toString() { return "PeopleKey [name=" + name + ", idcardno=" + idcardno + "]"; } }
注意:
1) 实现Serializable
接口(否则会报错,错误会直接显示);
2)在复合主键的类上,使用注解@Embeddable
3) 有默认的public无参数的构造方法(在我这个实例中,我没有添加有参构造方法,所以采用默认的构造方法)
如果你在实体类里有有参构造方法,那么一定要有一个无参构造方法,否则运行的时候会报错
org.hibernate.InstantiationException: No
default
constructor
for
entity: : com.my.model.People
这个就是没有默认的构造方法造成的,所以要在实体类中加入默认的无参构造方法。
4) 重写equals
和hashCode
方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。hashCode方法返回当前对象的哈希码(我验证EntityManger,不重写也没事。);
1.2、编写实体类:People
package com.my.model; import javax.persistence.*; @Entity @Table(name = "people") //@IdClass(PeopleKey.class) public class People extends PeopleKey{ // 复合主键要用这个注解 @EmbeddedId private PeopleKey id; @Column(name = "age") private int age; @Column(name = "address") private String address; // 省略setter,getter方法 @Override public String toString() { return "People [id=" + id + ", age=" + age + ", address=" + address + "]"; } }
还可以采用@IdClass来注解复合主键 ,过程和@Embeddable差不多,这里直接贴例子。
@Entity @Table(name = "people") @IdClass(PeopleKey.class) public class People implements Serializable { // @EmbeddedId // private PeopleKey id; @Id @Column(name = "name") private String name; @Id @Column(name = "idcardno") private String idcardno; @Column(name = "age") private int age; @Column(name = "address") private String address; }