Spring Data JPA-双向一对一关联映射

如果一个男孩和一个女孩相爱,那么她们的心里只能装着对方一个人,不能脚踏好几只船……

通过上面描述,我们明白这是一个双向的关联关系,而且都是一对一。这个和我前面讲过单向一对一十分类似。

甜美的爱情故事,生死相依

小红和小明的一段神话般的甜美爱情故事:有一天,小红问他男朋友小明:你心里有没有我?小明睁着眼睛说:当然了,心里满满的都是你。小明紧接着就反问他的女朋友小红:臭宝,你心里是不是也满满都是我?小红睁着眼睛回答说:当然了。

小红和小明,相互依赖,永不分离……

男孩domain

@Entity
@Table(name = "tb_boy")
@Getter
@Setter
public class Boy {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String boyName;@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "girl")private Girl boyHeart;
}

女孩domain

@Entity
@Table(name = "tb_girl")
@Getter
@Setter
public class Girl {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String girlName;@OneToOne@JoinColumn(name = "boy")private Boy girlHeart;
}

Repository:相当于他们的爱情,没有它就无法相互操控彼此的内心(数据)

public interface BoyRepository extends JpaRepository<Boy, Long> {}
public interface GirlRepository extends JpaRepository<Girl, Long> {}

这个男孩主动追求这个女孩并向她表白,起初只有男孩的心里装着这个女孩,后来经过男孩一顿猛如虎的操作,女孩爱上了男孩,这时两人都将彼此装在了心里……

    @Testpublic void testInsert() {// 初始化数据Boy boy = new Boy();boy.setBoyName("小明");Girl girl = new Girl();girl.setGirlName("小红");// 将对方都装在心里boy.setBoyHeart(girl);girl.setGirlHeart(boy);boyRepository.save(boy);}

日志输出

Hibernate: insert into tb_girl (boy, girl_name) values (?, ?)
Hibernate: insert into tb_boy (girl, boy_name) values (?, ?)
Hibernate: update tb_girl set boy=?, girl_name=? where id=?

数据库

可以看到,他们相互都装着对方。

上面这样做会出现一个问题就是:这两张表你都删不掉,数据你也删不掉,因为两张表中相互依赖了外键,除非你把外键解除了。

这是一个甜蜜的爱情故事,相互相依永不分离。

凄惨的爱情故事,合久必分

小红和小明的一段凄惨的爱情故事:有一天,小红问他男朋友小明:你心里有没有我?小明闭着眼睛说:当然了,心里满满的都是你。小明就反问他的女朋友小红:臭宝,你心里是不是也满满都是我?小红睁着眼睛回答说:当然了。

通过上面一段凄惨的爱情故事我们知道,男孩是个渣男,她心里根本没有女孩,因为女孩问男孩时男孩是闭着眼睛回答的……

女孩domain

@Entity
@Table(name = "tb_girl")
@Getter
@Setter
public class Girl {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String girlName;@OneToOne@JoinColumn(name = "boy_heart")private Boy girlHeart;
}

男孩domain

@Entity
@Table(name = "tb_boy")
@Getter
@Setter
public class Boy {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String boyName;@OneToOne(cascade = CascadeType.ALL, mappedBy = "girlHeart")@JoinColumn(name = "girl")private Girl boyHeart;
}

这个男孩主动追求这个女孩并向她表白,同样经过男孩一顿猛如虎的操作,女孩爱上了男孩,女孩的心里从此多了个男孩,但是男孩心里没有女孩,男孩只是想……

    @Testpublic void testInsert() {// 初始化数据Boy boy = new Boy();boy.setBoyName("小明");Girl girl = new Girl();girl.setGirlName("小红");// 将对方都装在心里boy.setBoyHeart(girl);girl.setGirlHeart(boy);boyRepository.save(boy);}

日志输出

Hibernate: insert into tb_boy (boy_name) values (?)
Hibernate: insert into tb_girl (boy, girl_name) values (?, ?)

数据库

可以看到,这时男孩心里并没有女孩。

上面这样做也会出现一个问题:这两张表中其中有一张表会依赖另一张表的主键。也就是说,只要男孩提分手,女孩立马同意分手,而且女孩没有主动权,这是一个凄惨的爱情故事,啊呸!

双向一对一操作中,查询任意一方都可以查询出另一方的信息,哪怕有一方没有维护外键。

Spring Data JPA-双向一对一关联映射相关推荐

  1. Spring Data JPA-单向一对一关联映射

    Spring Data JPA-单向一对一关联映射 假如有一张客户表和一张银行账户表,如果想在客户表中关联该客户的银行账户信息,那么这就是一个单向一对一的映射关系. 配置映射关系 在客户domain中 ...

  2. Spring Data JPA 多表关联查询的实现

    Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...

  3. jpa双向一对一关联外键映射

    项目结构: Wife package auth.model;import javax.persistence.CascadeType; import javax.persistence.Column; ...

  4. spring boot jpa的一对一关联(简洁)

    今天看了很多代码,发现大部分人都是复制的一篇代码,头大..自己第一次写这个.有了一些经验,我是用的双向一对一: 这是第一个实体类(model) @Entity @Table(name = " ...

  5. Spring Data JPA问题汇总

    刚进公司,发现都用的Spring Data JPA,一脸懵,知乎上遇到了一个大佬写的文章,非常详细,分享一下,我把大佬的文章整理了一下格式,比较好看了,原文链接:https://zhuanlan.zh ...

  6. Hibernate、JPA、Spring Data JPA,傻傻分不清

    国庆假期接近尾声,明天最后一天了,要开始收收心啦- 今天讲讲一个初学者(或许一些老手)可能没去搞懂的几个概念:Hibernate.JPA.Spring Data JPA 之间的关联. 嘿嘿,前段时间有 ...

  7. Spring Data JPA实现多表的关联查询

    1.Spring Data JPA关系映射 对象关系映射(Object relational mapping)是指通过将对象状态映射到数据库列,来开发和维护对象和关系数据库之间的关系.它能够轻松处理( ...

  8. Spring Data JPA 实现多表关联查询

    原文链接:https://blog.csdn.net/johnf_nash/article/details/80587204 多表查询在spring data jpa中有两种实现方式,第一种是利用hi ...

  9. JPA的双向一对一关联实现示例

    本篇的环境 本篇基于Spring Boot + JPA+ MySQL. 表自动维护: 配置 ddl-auto: update,使用 Hibernate 根据类自动维护表. 环境搭建参考: Spring ...

最新文章

  1. ubuntu nohup php,Ubuntu安装PhpStorm并设置快速启动phpstorm
  2. 数据库安全性之使用命令来实现用户管理以及角色.十五
  3. Linux_Bash脚本基础
  4. 【364天】跃迁之路——程序员高效学习方法论探索系列(实验阶段122-2018.02.04)...
  5. 大小端问题傻傻分不清?
  6. python元组读取到列表_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...
  7. java apktoo_apktool.jar最新版下载|apktool_2.0.3.jar 官方版_最火软件站
  8. 学会这篇文章分享的知识,你就超过了90%的测试人
  9. mac 黑窗口连接mysql_macOS -- Mac系统如何通过终端使用mysql
  10. 来兄弟连了,你还在用面向过程唱高音歌曲的你就OUT了
  11. Knowledge 7一阶谓词逻辑-Generalized Modus Ponens规则
  12. 紫书刷题记录 UVa12100 打印队列
  13. Spring Boot 整合 Spring Data JPA
  14. pyecharts官网
  15. 【ZZULIOJ】1011: 圆柱体表面积
  16. 企业人事管理系统V0.2.0
  17. 网络应用发布到linux上的web服务器上页面上显示麻将牌式字符的问题
  18. OpenLayers基础教程——要素的编辑
  19. python学习需要基础吗_要学 Python 需要怎样的基础?
  20. 安卓音响相位测试软件,音响相位测试仪app 有没有简单测声压的app?

热门文章

  1. IBM SPSS的Sav文件读/写
  2. 《Beyond Short Clips: End-to-End Video-Level Learning with Collaborative Memories》论文笔记
  3. Python环境配置和安装包总结
  4. 使用Python修改可执行文件-EXE的图标
  5. rhel6的部分版本使用intel xeon处理器时的bug
  6. 【大学物理·光学】薄膜干涉
  7. python把英语句子成分字母_英语句子成分和英语句子结构讲解及练习
  8. 计算机职业与个人素质的关系,论高职计算机专业学生综合素质和职业技能与就业的关系...
  9. 所托非人勿怪人,忠人之事需灵变
  10. 可擦写光盘不能擦除和刻写_什么是可擦写光盘 什么时候要用到可擦洗光盘(擦除光盘)...