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

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


单向关系的一对多注解 @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;
    @ManyToOne
    private 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 {

    @Autowired
    private SchoolRepository schoolRepository;
    @Autowired
    private TeacherRepository teacherRepository;

    @Test
    public void add() {
        School school1 = new School();
        school1.setName("清华大学");
        schoolRepository.save(school1);
        Teacher teacher = new Teacher();
        teacher.setName("long");
        teacher.setSchool(school1);
        teacherRepository.save(teacher);
    }

    @Test
    public 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());
        }
    }

    @Test
    public void deleteSchoolById() {
        schoolRepository.deleteById(3);
    }

    @Test
    public void deleteTeacherById() {
        teacherRepository.deleteById(7);
    }
}

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

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

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

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

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

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

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

🚀 在双向一对多关系中:

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

相关推荐

  1. MyBatis 自定义映射 ResultMap:映射关系处理

    2024-07-12 09:34:04       28 阅读
  2. MyBatis笔记——映射问题解决

    2024-07-12 09:34:04       32 阅读
  3. Mybatis映射之一映射

    2024-07-12 09:34:04       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 09:34:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 09:34:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 09:34:04       57 阅读
  4. Python语言-面向对象

    2024-07-12 09:34:04       68 阅读

热门阅读

  1. Emacs有什么优点,用Emacs写程序比IDE更方便吗?

    2024-07-12 09:34:04       28 阅读
  2. 从C向C++18——演讲比赛流程管理系统

    2024-07-12 09:34:04       20 阅读
  3. Android11 MTK 状态栏添加无Sim卡图标

    2024-07-12 09:34:04       28 阅读
  4. springboot+vue项目实战2024第四集修改文章信息

    2024-07-12 09:34:04       27 阅读
  5. c#验证输入语句是否带有sql入侵的方法

    2024-07-12 09:34:04       26 阅读
  6. 【LinuxC语言】手撕Http协议之GET方法的实现

    2024-07-12 09:34:04       24 阅读
  7. 云端荣耀:在iCloud中记录您的个人成就与荣誉

    2024-07-12 09:34:04       29 阅读
  8. Postman接口测试工具详解

    2024-07-12 09:34:04       26 阅读
  9. GESP C++ 三级真题(2024年3月)T2 完全平方数

    2024-07-12 09:34:04       22 阅读
  10. 【排序 - 选择排序优化版(利用堆排序)】

    2024-07-12 09:34:04       22 阅读
  11. 【贪心算法题记录】134. 加油站

    2024-07-12 09:34:04       24 阅读
  12. 超级源点/汇点(算法篇)

    2024-07-12 09:34:04       30 阅读
  13. 【MySQL】6.表的增删查改(CURD)

    2024-07-12 09:34:04       23 阅读