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

2024-07-12 1020阅读

《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 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 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 方法,在控制台输出如下结果:

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

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

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

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

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

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

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

        可以看到,先将所有 Teacher 表的外键设置为空,然后删除 School 表的指定值。

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

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

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

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

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

        可见是直接删除指定 Teacher 表的值,并没有删除 School 表的数据。

        🚀 在双向一对多关系中:

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

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]