• 【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 的一方),关系的接收端需要定义一个发出端的字段属性。
  • 相关阅读:
    手持电动工具CE认证EN62841标准怎么做?
    HTTPS基础原理和配置-2
    glib编程1:hello world
    js:Lodash一个JavaScript 实用工具库
    一位大咖写给软件编程新手的建议 - 经验谈
    2023年11月11日~11月17日周报(基于matlab生成模拟数据、批量修改文件名、重写dataset)
    Django与Ajax
    小型气象站硬件和软件均采用模块组合式开放性设计,可灵活组合使用
    flink-cdc-connectors-release-2.4.1编译记录
    用手机拍商品图的技巧 、五步拍出不输相机效果的商品图、新品发朋友圈的技巧
  • 原文地址:https://blog.csdn.net/be_racle/article/details/140243343