SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题

下面是SpringDataJpa关系映射的完整攻略。

一对一

1. 创建实体类

我们在使用SpringDataJpa中的一对一关系映射时,需要创建两个实体类,实体类之间通过@OneToOne建立映射关系。

我们以学生和身份证为例:

@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "card_id")
    private IDCard card;
    // 省略getter/setter方法
}

@Entity
public class IDCard {
    @Id
    private Long id;
    private String number;
    // 省略getter/setter方法
}

通过以上实体类,我们就建立了学生和身份证一对一的关系。

2. 创建DAO接口

在创建DAO接口时,我们需要继承JpaRepository接口,同时使用@Repository注解

@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}

通过以上接口,我们就建立了Student和数据库之间的关系。

3. 测试

通过以上的操作,我们已经建立了学生和身份证实体类之间的一对一关系,接下来就可以进行测试了。

@SpringBootTest
class ApplicationTests {
    @Autowired
    private StudentRepository studentRepository;

    @Test
    void testSave() {
        IDCard card = new IDCard();
        card.setNumber("1234567890");
        Student student = new Student();
        student.setName("Tom");
        student.setCard(card);

        studentRepository.save(student);
    }
}

在进行测试时,我们首先创建一个身份证实体类,然后再新建一个学生,将身份证设为学生的身份证,最后通过JpaRepository的save()方法保存到数据库中。

一对多

1. 创建实体类

在一对多关系映射时,我们需要创建两个实体类,其中一个实体类中包含多个另一个实体类的引用,通过@OneToMany建立映射关系。

我们以班级和学生为例:

@Entity
public class Student {
    @Id
    private Long id;
    private String name;

    // 关联班级列表
    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<ClassRelation> relationList;
    // 省略getter/setter方法
}

@Entity
public class ClassRelation {
    @Id
    private Long id;
    private String className;

    // 学生
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "student_id")
    private Student student;
    // 省略getter/setter方法
}

2. 创建DAO接口

DAO接口同理,需要继承JpaRepository并使用@Repository注解。

@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}

3. 测试

与一对一关系映射的测试类相似,只是在测试数据的准备过程中需要创建多个班级和学生的对应关系。

@SpringBootTest
class ApplicationTests {
    @Autowired
    private StudentRepository studentRepository;

    @Test
    void testSave() {
        Student student = new Student();
        student.setName("Tom");

        List<ClassRelation> relationList = new ArrayList<>();

        ClassRelation classRelationA = new ClassRelation();
        classRelationA.setClassName("Class A");
        classRelationA.setStudent(student);
        relationList.add(classRelationA);

        ClassRelation classRelationB = new ClassRelation();
        classRelationB.setClassName("Class B");
        classRelationB.setStudent(student);
        relationList.add(classRelationB);

        student.setRelationList(relationList);

        studentRepository.save(student);
    }
}

通过以上测试,我们成功地建立了班级和学生之间的一对多关系。

多对多

1. 创建实体类

在多对多关系映射时,我们需要创建两个实体类,用@ManyToMany注解建立连接关系。

我们以学生和课程为例:

@Entity
public class Student {
    @Id
    private Long id;
    private String name;

    // 选修课程列表
    @ManyToMany(mappedBy = "students", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Course> courseList;
    // 省略getter/setter方法
}

@Entity
public class Course {
    @Id
    private Long id;
    private String name;

    // 学生列表
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "student_course", joinColumns = {@JoinColumn(name = "course_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "student_id", referencedColumnName = "id")})
    private List<Student> students;
    // 省略getter/setter方法
}

在上述代码中,我们分别在学生和课程实体类中声明了课程列表和选修了该课程的学生列表,两个列表使用@ManyToMany注解相互连接。

需要注意的是,我们使用@JoinTable注解可以指定表名,以及joinColumns和inverseJoinColumns属性分别表示关联关系中两个实体的外键名。

2. 创建DAO接口

创建完实体类以后,我们还需创建对应的DAO接口。同样,需要继承JpaRepository。

@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
}

3. 测试

在测试时,需要创建多个学生和课程对象,并建立对应的选课关系。

@SpringBootTest
class ApplicationTests {
    @Autowired
    private CourseRepository courseRepository;

    @Test
    void testSave() {
        Course courseA = new Course();
        courseA.setName("Course A");

        Course courseB = new Course();
        courseB.setName("Course B");

        Student studentA = new Student();
        studentA.setName("Tom");

        Student studentB = new Student();
        studentB.setName("Jerry");

        // 根据主从表的关系,需要维护两个方向的数据
        studentA.getCourseList().add(courseA);
        studentA.getCourseList().add(courseB);

        courseA.getStudents().add(studentA);

        studentB.getCourseList().add(courseA);
        studentB.getCourseList().add(courseB);

        courseA.getStudents().add(studentB);
        courseB.getStudents().add(studentB);

        courseRepository.save(courseA);
        courseRepository.save(courseB);
    }
}

通过以上测试,我们成功地建立了学生和课程之间的多对多关系。

综上所述,我们通过以上三个例子详细讲述了SpringDataJpa关系映射的使用方法。在具体开发中,也可按照此方法进行实际应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 快速解决Tomcat启动慢的问题,超简单

    以下是“快速解决Tomcat启动慢的问题,超简单”的攻略: 问题描述 Tomcat 是一个广泛使用的 Java Web 服务器,但是在启动的时候有时会比较慢,特别是第一次启动。这个问题可能会给用户带来不好的体验,所以我们需要找到一种简单有效的方法来解决这个问题。 诊断原因 在解决 Tomcat 启动慢的问题之前,我们需要确认问题的具体原因。通常,慢启动可能有…

    Java 2023年6月2日
    00
  • Java C++ 算法leetcode828统计子串中唯一字符乘法原理

    Java C++ 算法leetcode828统计子串中唯一字符乘法原理 题目描述 给定一个字符串,你需要统计其中唯一字符的个数。 具体地,你需要统计所有的出现恰好一次的字符的个数。 示例 输入: “ABCDEF”输出: 6解释: 出现一次的字符有 ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’,因此唯一字符的个数为 6。 输入: “ABCDEFAB…

    Java 2023年5月19日
    00
  • Linux中使用Shell脚本查看Java线程的CPU使用情况

    下面是在Linux中使用Shell脚本查看Java线程的CPU使用情况的完整攻略: 1. 确认Java进程ID 在使用Shell脚本来查看Java线程CPU使用情况之前,我们需要确定Java应用程序的进程ID。可以使用命令: ps -ef | grep java 该命令将显示运行中的所有Java进程的进程ID、启动时间等信息,如下所示: root 1234 …

    Java 2023年5月20日
    00
  • java开发MyBatis中常用plus实体类注解符详解

    Java开发MyBatis中常用Plus实体类注解符详解 什么是MyBatis Plus? MyBatis Plus是MyBatis的一个增强工具,在MyBatis基础之上进行扩展。MyBatis Plus提供了很多实用的增强功能,如分页查询、条件构造器、逻辑删除、自动填充等,使得开发人员可以更加快捷地编写代码。在MyBatis Plus中,实体类注解符是其…

    Java 2023年5月20日
    00
  • 使用Spring扫描Mybatis的mapper接口的三种配置

    使用Spring扫描Mybatis的mapper接口是在Spring应用中很常见的用法,下面介绍三种配置方式。 1. 通过MapperScan注解 这是Spring提供的最简单的一种方式,只需要在@Configuration类上加上@MapperScan(“mapperPackagePath”)即可。其中,mapperPackagePath是mapper接口…

    Java 2023年5月20日
    00
  • jsp 文件上传浏览,支持ie6,ie7,ie8

    实现 JSP 文件上传浏览并支持 IE6, IE7, IE8 可以通过以下步骤实现: 使用 form 表单实现文件上传 JSP 文件上传可以通过 form 表单中的 enctype 属性来实现: <form method="post" enctype="multipart/form-data" action=&q…

    Java 2023年6月15日
    00
  • 详解JavaEE 使用 Redis 数据库进行内容缓存和高访问负载

    详解JavaEE 使用 Redis 数据库进行内容缓存和高访问负载攻略 简介 JavaEE 是一种基于 Java 语言实现的企业级应用程序开发标准。在进行 JavaEE 企业级应用程序开发过程中,数据库缓存和高访问负载问题一直是需要解决的关键技术问题。Redis 是一种基于内存的高性能 key-value 数据库,它能够有效地解决 JavaEE 应用程序的缓…

    Java 2023年5月20日
    00
  • 浅谈Java抽象类和接口的个人理解

    浅谈Java抽象类和接口的个人理解 Java是一门面向对象编程语言,面向对象编程的三大特性是封装、继承和多态。抽象类和接口都是Java中体现多态的机制。 抽象类 抽象类是不能被实例化的类,它通常被用于抽象出多个类中的共性并定义出它们的方法名、参数列表、返回类型和访问类型,由其子类来实现这些方法。 抽象类的定义方式为: public abstract clas…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部