OneToOne
OneToOne定义了两个实体之间一对一的关系,有双向关系和单向关系
一般用法如下:
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(unique = true)
private Wife wife;
OneToOne有如下属性可选:
targetEntity
: 关联的对象所属的类,由于默认采用字段类型所属的类,所以基本不用指定cascade
: 级联,默认无级联CascadeType.ALL
CascadeType.PERSIST
保存CascadeType.MERGE
更新CascadeType.REMOVE
删除CascadeType.REFRESH
CascadeType.DETACH
fetch
: 饥渴加载或懒加载FetchType.LAZY
懒加载FetchType.EAGER
饥渴加载(默认)
optional
: 能否为空true
不能为空false
可以为空
mappedBy
: 只用于被拥有关系方,用于标示拥有关系方的关联字段
cascade
我们假设有2个类,Husband & Wife ,单向关系
public class Husband{
private Long id;
private String name;
//先不设置级联
@OneToOne
@JoinColumn(name="wife_id",unique = true)
private Wife wife;
//剩下的省略
}
public class Wife{
private Long id;
private String name;
@OneToOne(mappedBy = "wife")
private Husband husband;
//剩下的省略
}
给后台新增的Husband数据
{
"name": "shuaige",
"wife": {
"name": "meinv"
}
}
CascadeType.PERSIST
添加前:
操作:向后台新增数据
结果:Husband
添加成功,Wife
没有添加
添加后:
操作:向后台新增数据
结果:Husband
& Wife
都添加成功
结论:CascadeType.PERSIST
可进行级联插入
CascadeType.REMOVE
添加前:
操作:根据id
删除刚才新增Husband
数据
结果:Husband
删除成功 ,Wife
未删除
添加后:
操作:根据id删除刚才新增Husband数据
结果:Husband
& Wife
都删除成功
结论:CascadeType.REMOVE
可进行级联删除
CascadeType.MERGE
添加前:
操作:更新Wife
的name
为meinv2
结果:Wife
的name
值未更新成功
添加后:
操作:更新Wife
的name
为meinv2
结果:Wife
的name
值更新成功
结论:CascadeType.MERGE
可进行级联更新
mappedBy
用于被拥有关系方,标示拥有关系方的关联字段
例如之前的Husband
和 Wife
, Husband
是关系拥有方,Husband.wife_id = Wife.id
所以
public class Husband{
//省略
@OneToOne
@JoinColumn(name="wife_id",unique = true)
private Wife wife;
//剩下的省略
}