简介:
有时候会把一张大表拆分为两个小表,一个主表一个从表,从表的id根据主表生成,两表的id一样,所以称为共享id;
主表的id是自动生成的,也就是先新建几条主表信息,保存从表的时候再集。(主表)从表的id就会根据主表生成;
从表端,维护端(有外键方):
@Id
@GenericGenerator(name =“pkGenerator”,strategy =“foreign”,
parameters = {@Parameter(name =“property”,value =“idCard”)}
)
@ GeneratedValue(generator =“pkGenerator”)@ Column (name =“userId”)
public int getUserId(){
return userId;
}
@OneToOne
@PrimaryKeyJoinColumn
@Cascade(CascadeType.ALL)//设置级联操作,这样主表可以新建的,保存从表时一块把主表保存了,级联也可以设置在主表那,这样就要先保存主表,主表不能是新建的
public IdCard getIdCard(){
return idCard;
}
主表方,id自动生成被维护端(无外键方):
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =“idCardId”)
public int getId(){
return Id;
}
@OneToOne(mappedBy =“idCard”)
@
Cascade(CascadeType.ALL)@PrimaryKeyJoinColumn
public User getUser(){
return user;
}
假设有两个类:用户(用户)与IdCard(身份证),一个用户对应一个身份证。
1.先写了两个实体Person和PersonExt,主要配置如下:
@Entity
@Table(name = "person") //主表
public class Person implements Serializable{
private Integer id;
private String name;
private Integer age;
private PersonExt personExt;
@Id
@GeneratedValue(generator = "pkGenerator")
@GenericGenerator(name = "pkGenerator", strategy = "native")
@Column(name = "ID", length = 8)
public Integer getId() {
return id;
}
@OneToOne(cascade = CascadeType.ALL, mappedBy = "person", fetch = FetchType.LAZY)
public PersonExt getPersonExt() {
return personExt;
}
// 其它setter、getter方法略...
}
@Entity
@Table(name = "person_ext")//从表
public class PersonExt implements Serializable{
private Integer id;
@JsonIgnore //返回给前台不用序列化 该属性,避免双向关联一直嵌套循环
private Person person;
private String address;
/**
* 本例是双向一对一的共享主键
* 注意事项:
* 1.主表和从表的主键类型要一致,不能主表主键为Integer,从表是String
*/
@Id
@GeneratedValue(generator = "pkGenerator")
@GenericGenerator(
name = "pkGenerator",
strategy = "foreign",
parameters = @Parameter(name = "property", value = "person"))
@Column(name = "ID", nullable = false, unique = true)
public Integer getId() {
return id;
}
@OneToOne(fetch = FetchType.LAZY, optional = false)
@PrimaryKeyJoinColumn // 这个注解不能少。如果不加这个注解,添加扩展信息时,就会自动在person_ext表中增加了一个外键列person_id.
public Person getPerson() {
return person;
}
// 其它setter、getter方法略...
}
测试
。1,在人表插入了几条数据,主表的信息要先保存几条
2,添加人物扩展信息
3,得到结果如下:
因为1号人物乔峰没有添加扩展信息,所以在person_ext表中没有记录。
由以上可以看得出人表的主键和person_ext表的主键是一一对应的。至此,共享主键设置成功了