产品迭代引入JPA,记录一下初次使用 @OneToOne和遇到的坑。由于我也是边学边实操,暂时没有深入原理只有实操(饭碗要先保住),开干。。。
一、 @OneToOne 如何使用
二、可能会出现的异常情况
一、@OneToOne如何使用
先上菜,准备好以下注解:
@OneToOne(mappedBy = "xxxx")
@JoinColumn(name = "xxxx", referencedColumnName = "xxxx")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
举个栗子:
1个人只能拥有1个性别,这个大家都认同吧,那么现在需要定义两个实体:
Person 实体和Gender实体
/**
* 人 实体
* 此类理解为 拥有方
*/
public class Person{
//id
private String id;
//姓名
private String name;
//性别id
private Gender gender;
}
/**
* 性别 实体
* 此类理解为 被拥有方
*/
public class Gender{
//id
private String id;
//性别描述
private desc;
}
实现单向关联
/** 一、在拥有方加入两个注解就完成了单向关联
* @OneToOne
* @JoinColumn(name = "gender_id", referencedColumnName = "id")
* name和referencedColumnName 定义了关联关系
* Person表的 gender_id 和 Gender表的id 关联
*/
/**
* 人 实体
* 此类理解为 拥有方
*/
public class Person{
//id
private String id;
//姓名
private String name;
//性别id
@OneToOne
@JoinColumn(name = "gender_id", referencedColumnName = "id")
private Gender gender;
}
/**
* 性别 实体
* 此类理解为 被拥有方
*/
public class Gender{
//id
private String id;
//性别描述
private desc;
}
实现双向关联
/** 一、在被拥有方两行代码
* @OneToOne(mappedBy = "gender")
* private Person person
* mappedBy 指向 被拥有方,个人理解: 被拥有方(Gender)告诉Person, 我在Person里应该映射到gender属性
*/
/**
* 人 实体
* 此类理解为 拥有方
*/
public class Person{
//id
private String id;
//姓名
private String name;
//性别id
@OneToOne
@JoinColumn(name = "gender_id", referencedColumnName = "id")
private Gender gender;
}
/**
* 性别 实体
* 此类理解为 被拥有方
*/
public class Gender{
//id
private String id;
//性别描述
private desc;
@OneToOne(mappedBy = "gender")
private Person person;
}
至此一对一的双向关联就完成了
漏了一个注解没解释
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
如果双向关联出现 死循环 的现象,在Person和Gender类上分别都加上次此注解方可化解。
注意事项:
关联的字段类型包括字段编码格式必须要保持一致
估计明后天就会使用到级联操作,明天就要用了,我还不会