当前位置: 首页 > news >正文

【Spring Boot】关系映射开发(二):一对多映射

JPA 从入门到精通》系列包含以下文章:

  • Java 持久层 API:JPA
  • 认识 JPA 的接口
  • JPA 的查询方式
  • 基于 JPA 开发的文章管理系统(CRUD)
  • 关系映射开发(一):一对一映射
  • 关系映射开发(二):一对多映射
  • 关系映射开发(三):多对多映射

关系映射开发(二):一对多映射

  • 1.编写实体
    • 1.1 新建 School 实体
    • 1.2 新建 Teacher 实体
  • 2.测试映射关系

单向关系的一对多注解 @oneToMany,只用于关系的发出端( 的一方)。另外,需要关系的发出端定义一个 集合类型 的接收端的字段属性。

在一对多关联关系映射中,默认是以 中间表 方式来映射这种关系的。中间表的名称为 “用下画线连接关系的 拥有端发岀端)和 Inverse 端(接收端)”,中间表两个字段分别为两张表的表名加下画线 _ 再加主键组成。

当然,也可以改变这种默认的中间表的映方式。在关系的拥有端,使用 @JoinClolum 注解定义外键来映射这个关系。

1.编写实体

下面以学校(School)和老师(Teacher)来演示一对多的映射关系。

1.1 新建 School 实体

@OneToMany 中 One 的一方 School,见以下代码:

package com.example.demo.entity;import lombok.Data;
import javax.persistence.*;
import java.util.List;@Entity
@Data
public class School {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;private String name;// @OneToMany(cascade = CascadeType.ALL)@OneToMany()@JoinColumn(name = "school_id")private List<Teacher> teacherList;
}

1.2 新建 Teacher 实体

@OneToMany 中 Many 的一方 Teacher,见以下代码:

package com.example.demo.entity;import lombok.Data;
import org.hibernate.annotations.Proxy;
import javax.persistence.*;@Data
@Entity
public class Teacher {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;private String name;@ManyToOneprivate School school;
}

2.测试映射关系

Service 和 Repository 层在《关系映射开发(一):一对一映射》已经讲过,这里并没有区别,所以不再赘述。

下面直接测试一对多的关系映射。在测试类中,写入以下代码:

package com.example.demo.entity;import com.example.demo.repository.SchoolRepository;
import com.example.demo.repository.TeacherRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@SpringBootTest
@RunWith(SpringRunner.class)
public class OneToManyTest {@Autowiredprivate SchoolRepository schoolRepository;@Autowiredprivate TeacherRepository teacherRepository;@Testpublic void add() {School school1 = new School();school1.setName("清华大学");schoolRepository.save(school1);Teacher teacher = new Teacher();teacher.setName("long");teacher.setSchool(school1);teacherRepository.save(teacher);}@Testpublic void find() {School school1 = new School();school1 = schoolRepository.findSchoolById(1);List<Teacher> teacherList = school1.getTeacherList();System.out.println(school1.getName());for (Teacher teacher : teacherList) {System.out.println(teacher.getName());}}@Testpublic void deleteSchoolById() {schoolRepository.deleteById(3);}@Testpublic void deleteTeacherById() {teacherRepository.deleteById(7);}
}

运行测试 add 方法,在控制台输出如下结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行测试 find 方法,在控制台输出如下结果:

在这里插入图片描述
运行测试 deleteSchoolById 方法,在控制台输出如下结果:

在这里插入图片描述
可以看到,先将所有 Teacher 表的外键设置为空,然后删除 School 表的指定值。

在这里插入图片描述
在这里插入图片描述

运行测试 deleteTeacherByld 方法,在控制台输岀如下结果:

在这里插入图片描述
在这里插入图片描述
可见是直接删除指定 Teacher 表的值,并没有删除 School 表的数据。

🚀 在双向一对多关系中:

  • 注解 @OneToMany(mappedBy='发出端实体名称小写') 用于关系的 发出端(即 One 的一方),同时关系的发出端需要定义一个集合类型的接收端的字段属性。
  • 注解 @ManyToOne 用于关系的 接收端(即 Many 的一方),关系的接收端需要定义一个发出端的字段属性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【git命令大全】
  • Vue 3 与 TypeScript:最佳实践详解
  • Android ViewPostImeInputStage输入事件处理
  • 【MindSpore学习打卡】应用实践-LLM原理和实践-基于MindSpore实现BERT对话情绪识别
  • 【机器学习】独立成分分析(ICA):解锁信号的隐秘面纱
  • 道路运输企业管理人员安全考核试题(附答案)
  • 如何在工作中开悟?
  • element 如何实现文件上传下载导出
  • 基于QT开发的反射内存小工具
  • OWASP ZAP
  • 低代码研发项目管理流程优化:提效与创新的双重驱动
  • 【Unity2D 2022:UI】制作主菜单
  • 昇思25天学习打卡营第1天|初步了解
  • [Linux][Shell][Shell函数]详细讲解
  • Qt 统计图编程
  • 【译】JS基础算法脚本:字符串结尾
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android 控件背景颜色处理
  • C++类中的特殊成员函数
  • flutter的key在widget list的作用以及必要性
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • go语言学习初探(一)
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java的Interrupt与线程中断
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Vim Clutch | 面向脚踏板编程……
  • windows下mongoDB的环境配置
  • windows下使用nginx调试简介
  • 第十八天-企业应用架构模式-基本模式
  • 动态规划入门(以爬楼梯为例)
  • 将回调地狱按在地上摩擦的Promise
  • 如何优雅地使用 Sublime Text
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (02)Unity使用在线AI大模型(调用Python)
  • (2)STM32单片机上位机
  • (39)STM32——FLASH闪存
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (笔记)M1使用hombrew安装qemu
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (汇总)os模块以及shutil模块对文件的操作
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)Sublime Text3配置Lua运行环境
  • (转)树状数组
  • .NET 材料检测系统崩溃分析
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET与 java通用的3DES加密解密方法
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • :not(:first-child)和:not(:last-child)的用法
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @AliasFor注解
  • @hook扩展分析
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • [22]. 括号生成