知识点梳理
一对一存在主从关系, 共享主键意识是主从的ID值是一样的。
主键的生成策略参考配置属性qq的主键生成策略来生成, 顾名思义就是当前主键和QQ共享一个主键
1、建表
CREATE TABLE `qq` (
`id` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `qq_zone` (
`id` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FKi51io66786jftb2tummgb4row` FOREIGN KEY (`id`) REFERENCES `qq` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2、实体映射
主:
@Entity
@Table
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class QQ {
@Id
@GeneratedValue
private Integer id;
private String name;
@OneToOne(mappedBy = "qq", cascade = CascadeType.PERSIST) // zone_id不能为空
private QqZone zone;
@Override
public String toString() {
return "{id:"+getId()+",name:"+getName()+"}";
}
}
从:
需要注意的是:
1、主键生成策略
2、@PrimaryKeyJoinColumn必须添加该注释, 避免生成新的qq_id外键
@Entity
@Table
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class QqZone {
@Id
/**
*
* 主键的生成策略参考配置属性qq的主键生成策略来生成, 顾名思义就是当前主键和QQ共享一个主键
*
*/
@GeneratedValue(generator = "pkGenerator")
@GenericGenerator(name = "pkGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "qq"))
private Integer id;
private String name;
@OneToOne(optional = false)
@PrimaryKeyJoinColumn // 共享主键必须添加这个注解, 如果不添加该注解, 表qq_zone就会自动添加一个外键qq_id
private QQ qq;
@Override
public String toString() {
return "{id:"+getId()+",name:"+getName()+"}";
}
}
3、测试代码
@Test
public void init(){
QQ qq = new QQ();
qq.setName("猫");
QqZone zone = new QqZone();
zone.setQq(qq);
zone.setName("猫的QQ空间");
qq.setZone(zone);
qqRepository.save(qq);
}