hibernate 基于主键的双向一对一关联映射(@OneToOne) 注解方式

简介:

有时候会把一张大表拆分为两个小表,一个主表一个从表,从表的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表的主键是一一对应的。至此,共享主键设置成功了

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值