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

embedded/2024/10/18 14:16:06/

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


关系映射开发(三):多对多映射

  • 1.创建实体
    • 1.1 创建 Student 实体
    • 1.2 创建 Teacher 实体
  • 2.创建测试

多对多 关联关系中,只能通过 中间表 的方式进行映射,不能通过增加外键来实现。

注解 @ManyToMany 用于关系的发出端和接收端。关系的发出端定义一个集合类型的接收端的字段属性,关系的接收端不需要做任何定义。

1.创建实体

1.1 创建 Student 实体

java">package com.example.demo.entity;import lombok.Data;import javax.persistence.*;
import java.util.List;
import java.util.Set;@Entity
@Data
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;private String name;@Column(columnDefinition = "enum('male','female')")private String sex;@ManyToMany(fetch = FetchType.LAZY)@JoinTable(name = "teacher_student", joinColumns = {@JoinColumn(name = "s_id")}, inverseJoinColumns = {@JoinColumn(name = "t_id")})private Set<Teacher> teachers;
}

1.2 创建 Teacher 实体

java">package com.example.demo.entity;import lombok.Data;import javax.persistence.*;
import java.util.List;
import java.util.Set;@Data
@Entity
public class Teacher {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;private String name;@ManyToMany(fetch = FetchType.LAZY)/*** Description:* 1、关系两边都作为主控;* 2、joinColumns 中 @JoinColumn(name="t_id") 其中 t_id 为 JoinTable 中的外键,由于 Student 和 Teacher 的主键都为 id 这边就省略 referencedColumnName="id"。*/@JoinTable(name = "teacher_student", joinColumns = {@JoinColumn(name = "t_id")}, inverseJoinColumns = {@JoinColumn(name = "s_id")})private Set<Student> students;
}

多对多 关系中需要注意以下几点:

  • 关系两方都可以作为主控。
  • joinColumns@JoinColumn(name="t_id") 中,t_id 为 JoinTable 中的外键。由于 Student 和 Teacher 的主键都为 id,所以这里省略了 referencedColumnName="id"
  • 在设计模型之间的级联关系时,要考虑好应该采用何种级联规则。
  • 如果设置 cascade = CascadeType.PERSIST,则在执行 save 时会调用 onPersist() 方法。这个方法会递归调用外联类(Student 或 Teacher)的 onPersist() 进行级联新增。但因为值已经添加了,所以会报 detached entity passed to persist 错误,将级联操作取消(去掉 cascade = CascadeType.PERSIST)即可。

在这里插入图片描述

2.创建测试

Service 和 Repository 层在《关系映射开发(一):一对一映射》已经讲过,这里并没有区别,所以不再赘述,直接进入测试层的代码编写。

java">package com.example.demo.entity;import com.example.demo.repository.StudentRepository;
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.HashSet;
import java.util.Set;import static org.junit.Assert.*;@SpringBootTest
@RunWith(SpringRunner.class)
public class ManyToManyTest {@Autowiredprivate StudentRepository studentRepository;@Autowiredprivate TeacherRepository teacherRepository;@Testpublic void add() {Set<Teacher> teachers = new HashSet<>();Set<Student> students = new HashSet<>();Student student1 = new Student();student1.setName("张三");students.add(student1);studentRepository.save(student1);Student student2 = new Student();student2.setName("李四");students.add(student2);studentRepository.save(student2);Teacher teacher1 = new Teacher();teacher1.setName("皮皮老师");teacher1.setStudents(students);teachers.add(teacher1);teacherRepository.save(teacher1);}
}

运行测试类,在控制器中输岀如下结果:

在这里插入图片描述

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

🚀 对于双向 ManyToMany 关系,注解 @ManyToMany 用于关系的发出端和接收端。另外,关系的接收端需要设置 @ManyToMany(mappedBy='集合类型发出端实体的字段名称')


http://www.ppmy.cn/embedded/58559.html

相关文章

实现基于Zookeeper的分布式协调服务

实现基于Zookeeper的分布式协调服务 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 什么是Zookeeper&#xff1f; Zookeeper是一个开源的分布式应用程序协调服务&#xff0c;提供高效的分布式数…

QT信号量与槽

文章目录 概述用系统生成新增一个信号量和槽代码方式信号量和槽的宏信号量和槽都用函数地址lamda表达式函数指针 槽和信号量函数信号量槽 小结 概述 这个内容是QT独有的&#xff0c;写的挺有意义的。之前写过一篇QT slots的函数&#xff0c;思来想去&#xff0c;觉得不是那么有…

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片 1 目标效果视频 CamManager 2 CamManager读取本地文件时序 3 BD_Vision_Utility添加代码 3.0 导入链接库 BD_OperatorSets.dllSystem.Windows.Forms.dllOpencvSharp 3.1 导入VisionParam中创建的文件Util_FileO…

09.AOP-尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)

现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 解决思路 解决核心&#xff1a;解耦。把附加功能从…

科研绘图系列:R语言小提琴图(Violin Plot)

介绍 小提琴图(Violin Plot)是一种结合了箱线图和密度图的图表,它能够展示数据的分布密度和分布形状。以下是对小提琴图的详细解释: 小提琴图能表达: 数据分布:小提琴图通过在箱线图的两侧绘制曲线来展示数据的分布密度,曲线的宽度表示数据点的密度。集中趋势:箱线图部…

主流电商平台营销中大数据的应用◆

随着经济的不断发展&#xff0c;网络信息技术不断加强&#xff0c;电子商务和大数据的蓬勃发展极大地方便了人们的生活。本文章主要阐述大数据分析与电商营销的含义、大数据分析在电子商务营销中的应用&#xff0c;以及该应用的作用和存在哪些不足及解决方法。探究大数据分析在…

odoo 去掉debug开启开发者模式

路径 addons\web\models\ir_http.py 搜索注释掉 方法_handle_debug()

Redis实践经验

优雅的Key结构 Key实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:id例&#xff1a;login:user:10长度步超过44字节&#xff08;版本不同&#xff0c;上限不同&#xff09;不包含特殊字符 优点&#xff1a; 可读性强避免key冲突方便管理节省内存&#x…