赞
踩
产品迭代引入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类上分别都加上次此注解方可化解。
注意事项:
关联的字段类型包括字段编码格式必须要保持一致
估计明后天就会使用到级联操作,明天就要用了,我还不会
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。