从零开始 Spring Boot 57:JPA中的一对多关系

news2025/1/11 8:48:58

从零开始 Spring Boot 57:JPA中的一对多关系

spring boot

图源:简书 (jianshu.com)

在上篇文章中我们介绍了如何在 JPA 中实现实体的一对一关系,在关系型数据库设计中,除了一对一关系,还存在一对多关系。本篇文章介绍如何在 JPA 中实现一对多关系。

模型

假设我们有两张表,学生表和电子邮件账号表,一个学生可以有多个电子邮件账号,一个电子邮件账号只能对应一个学生,这是典型的一对多关系,用数据库模型可以表示为:

image-20230703103038718

实体

用 JPA 实体实现就是:

@Entity
@Table(name = "user_student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    @NotBlank
    @Length(max = 45)
    private String name;
    private List<Email> emails;
}

@Getter
@Entity
@Table(name = "user_email")
public class Email {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    @NotBlank
    @Length(max = 45)
    private String account;
    @NotNull
    @NotBlank
    @Length(max = 45)
    private String domain;
    private Student student;

    public String toEmailAddress() {
        return "%s@%s".formatted(this.getAccount(), this.getDomain());
    }
}

Student实体有一个emails属性,表示一个学生可以拥有多个电子邮件。Email实体有一个student属性,表示一个电子邮件关联到一个学生。

关联关系

下面为这两个实体创建关联关系:

// ...
public class Student {
	// ...
    @OneToMany(mappedBy = "student",
            fetch = FetchType.EAGER,
            cascade = CascadeType.ALL,
            orphanRemoval = true)
    private List<Email> emails;
	// ...
}

// ...
public class Email {
	// ...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "student_id")
    private Student student;
	// ...
}

方式类似于前一篇文章中介绍的一对一关系的实现,只不过是用@ManyToOne取代@OneToOne。想了解相关注解的详细说明的,可以阅读之前的文章。

值得注意的是,就像一对一关系的那样,一对多关系同样存在着“关系拥有者”和“非拥有者”的区别。显然,在一对多关系中,“关系拥有者”必然是一对多关系的“多”所对应的实体(Email),因为这个实体对应的表(user_email)才真正拥有指向“一”的主键的外键约束(@JoinColumn(name = "student_id"))。

因此,在“关系拥有者”这边,我们需要用@JoinColumn指定外键约束,在关系的另一端(Student),我们需要用@OneToMany(mappedBy='student')指定关系由Email.student属性映射。

其实,“让一条信息能对应多条信息”并不一定要用两张表(实体)来实现,如果不需要对相应的信息进行检索和查询,完全可以在主表上用一个 JSON 格式的字段来保存多条“附加信息”。在 JPA 中可以通过属性转换器来实现,具体的方式可以阅读我的这篇文章。

The End,谢谢阅读。

可以从这里获取本文的完整示例代码。

参考资料

  • 从零开始 Spring Boot 53:JPA 属性转换器 - 红茶的个人站点 (icexmoon.cn)
  • 从零开始 Spring Boot 56:JPA中的一对一关系 - 红茶的个人站点 (icexmoon.cn)
  • Hibernate One to Many Annotation Tutorial | Baeldung

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android仿淘宝、京东、拼多多搜索历史

详情见代码 &#xff1a;https://github.com/yixiaolunhui/FSearchHistory

计算机网络概述(一)

因特网概述 网络&#xff0c;互联网与因特网的区别联系&#xff1a; 以上是使用有线和无线链路连接的两个网络。那么&#xff0c;要让这两个网络连接起来&#xff0c;就需要路由器。若干个网络通过多个路由器互联起来&#xff0c;就称为了互联网。 因特网是当今世界上最大的互…

基于springboot+vue的高校二手交易系统(源代码+数据库)080

基于springbootvue的高校二手交易系统(源代码数据库)080 一、系统介绍 本项目前后端分离 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、注册、(商品搜索、发布、收藏、下单)、评论、个人信息修改、密码修改、我的发布、我的订单、收藏夹 管理…

使用android studio将网站打包成apk(可以直接使用替换为自己的网站连接即可)

公司有这个需求生成一个webapp应用。前面一直在使用web与Android混合开发&#xff0c;越是后面你就发现越有意思。hbuildX官网不怎么维护&#xff0c;虽然一直说这是潮流&#xff0c;uni-app开发也挺火的&#xff0c;但是安卓开发特别是适配不同的手机型号&#xff0c;真的是头…

详解JS 作用域与作用域链、IIFE模式、js执行过程

文章目录 一、什么是作用域二. 全局作用域、函数作用域、块级作用域全局作用域函数作用域注意 if、for循环、while循环变量 块级作用域 二、什么是作用域链1. 什么是自由变量2.什么是作用域链3. 关于自由变量的取值 三、IIFE模式由来语法基本语法带参 四、JavaScript 执行过程编…

C++ 数据结构B 树

目录 1. 常见的搜索结构 2. B树概念 3. B-树的插入分析 4. B-树的插入实现 4.1 B-树的节点设计 4.2 插入key的过程 4.4 B-树的简单验证 4.5 B-树的性能分析 4.6 B-树的删除 5. B树和B*树 5.1 B树 5.2 B*树 5.3 总结 6. B-树的应用 6.1 索引 6.2 MySQL索引简介 6…

浅谈建筑项目中的智能照明系统的设计

张心志 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】&#xff1a;建筑智能照明工程中智能照明控制系统发展迅速&#xff0c;具有舒适性和节能性两方面优势。智能照明控制系统已经处于模块化高速发展阶段&#xff0c;如今更好的控制方案成为制约系统发展的瓶颈。文章在研…

工作总是忙不完是什么原因?时间管理软件帮你解决问题

随着市场竞争的激烈&#xff0c;有不少上班族都感受到了工作的压力&#xff0c;每天越来越多的工作任务需要完成。于是我们经常会听到这样的抱怨&#xff1a;“工作太多了&#xff0c;总是忙不完&#xff01;”那么工作总是忙不完是什么原因呢&#xff1f;其实一般来说工作总是…

GB50255-2014电气装置安装工程电力变流设备施工及验收规范

为了保证电力变流设备安装工程的施工质量&#xff0c;促进施工技术的提高&#xff0c;保证电力变流设备的安全稳定运行&#xff0c;制定本规范。 本规范适用于电力系统中除高压直流输电和柔性交流输电以外的电力变换设备的施工、调试及验收。 电力变流设备的施工、调试及验收…

linux epoll/select使用区分和实例对比

Linux内核poll&#xff0c;ppoll&#xff0c;epoll&#xff0c;select代码位置&#xff1a; poll&#xff0c;ppoll&#xff0c;select相关内核实现在在fs/select.c中; epoll_ctl和epoll_wait相关函数在fs/eventpoll.c中 epoll实测不支持监听普通文件&#xff0c;select可以…

医院中医临床护理中医理论考试题库及答案

本题库是根据最新考试大纲要求&#xff0c;结合近年来考试真题的重难点进行汇编整理组成的全真模拟试题&#xff0c;考生们可以进行专项训练&#xff0c;查漏补缺巩固知识点。本题库对热点考题和重难点题目都进行了仔细的整理和编辑&#xff0c;相信考生在经过了针对性的刷题练…

测试员拒绝当“背锅侠”,软件质量不是“测”出来的!

以前有个朋友跟我说&#xff1a;做测试这行就是在隐忍中负重前行。因为测试是软件发布前的最后一个环节&#xff0c;被称作质量出口儿&#xff0c;测试环节之前所有未做好的工作所带来的不良后果&#xff0c;似乎都能被轻松甩锅给测试人员。软件一旦出现问题&#xff0c;我们经…

django疫情防控常态化下疫情物资管理可视化系统-计算机毕设 附源码73893

django疫情防控常态化下疫情物资管理可视化系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。…

YOLOv5改进系列(13)——更换激活函数之SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC系列等

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

javaWeb中的Ajax_待后期增加

前言&#xff1a; Ajax是一种在JavaWeb开发中常用的技术&#xff0c;通过它可以实现异步通信和动态加载数据&#xff0c;提升用户体验。 正文&#xff1a; 首先我们得明白异步通信&#xff0c;客户端发出请求后可以继续执行其他操作 由于原生的Ajax过于复杂 so&#xff1a; …

FastDFS【SpringBoot操作FastDFS、复习】(三)-全面详解(学习总结---从入门到深化)

目录 SpringBoot操作FastDFS 复习&#xff1a; SpringBoot操作FastDFS 由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基 础上进行了大量重构工作&#xff0c;并于GitHub上发布了FastDFS-Client1.26.5。 主要特性 1 对关键部分代码加入了单元测试&#xff0c;便于…

leetcode 21.合并两个有序链表

⭐️ 往期相关文章 &#x1f4ab;链接1&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接2&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 206.反转链表 &#x1f4ab;链接4&#xff1a;leetcode 203.移除链…

蓝牙Beacon+Loa网关推出人员隔离监管解决方案

三年新冠已经过去&#xff0c;以空间换时间的防疫策略让疑似、确诊、有接触史人员得以有效控制&#xff0c;其中居家隔离的防疫措施对新冠的防控是行之有效的。 不过&#xff0c;在“画地为牢”的隔离区也有些需隔离观察人员私自外出&#xff0c;对防疫工作带来相当程度上的影…

数据库性能测试报告总结模板

目录 1计划概述 2参考资料 3术语解释 4系统简介 5测试环境 6测试指标 7测试工具和测试策略 8测试数据收集 9测试结果数据以及截图 9.1Jmeter性能指标 9.2硬件指标图 10 测试结论 需要完整报告模板记得文章末尾找我哦。 1计划概述 目的&#xff1a;找出系统潜在的…

Android Studio中配置aliyun maven库

Android Studio中配置aliyun maven库 在项目的根build.gradle里面&#xff08;不是module&#xff09;buildscriptde对应位置添加配置&#xff1a; buildscript {repositories {maven {url http://maven.aliyun.com/nexus/content/groups/public/allowInsecureProtocol true…