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日

相关文章

  • JDK8到JDK17有哪些吸引人的新特性?

    作者:京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源,从此成立了OpenJDK组织进行JDK代码管理。任何人都可以获取该源码,并通过源码构建一个发行版发布到网络上。但是需要一个组织审核来确保构建的发行版是有效的, 这个组织就是JCP(Java Community Process)。2009年,SUN公司被Oracle公司”白嫖”(参考2…

    Java 2023年4月18日
    00
  • spring boot环境抽象的实现方法

    好的。关于“spring boot环境抽象的实现方法”的完整攻略,我们可以从以下几个方面来进行讲解: 环境抽象的概念和作用; 环境抽象的实现方法; 示例演示。 环境抽象的概念和作用 首先,我们需要了解一下环境抽象的概念和作用。 环境抽象是指将不同环境下的配置信息进行抽象,以便在程序中能够灵活地切换和应用这些配置信息,从而实现不同环境之间的应用移植和部署。 在…

    Java 2023年5月19日
    00
  • JSP实用教程之简易文件上传组件的实现方法(附源码)

    让我来详细讲解一下“JSP实用教程之简易文件上传组件的实现方法(附源码)”的完整攻略。 什么是文件上传组件? 文件上传组件通常用于在网站上让用户上传文件,如图片、文档等。在JSP中,我们可以通过一些Java类和第三方库来实现上传功能。而本文将讲解一个简易的文件上传组件的实现方法。 实现步骤 在JSP页面中添加表单、输入框和上传按钮。 <form met…

    Java 2023年6月15日
    00
  • JDBC示例代码

    JDBC(Java Database Connectivity)是 Java 中连接不同数据库并实现数据操作的 API。下面是 JDBC 示例代码的完整攻略。 环境准备 在开始编写 JDBC 代码之前,需要先完成以下步骤: 下载并安装关系型数据库(如 MySQL、Oracle 等)。以下示例以 MySQL 为例。 下载并安装 JDBC 驱动程序。可以到官网下…

    Java 2023年5月20日
    00
  • 五分钟教你手写 SpringBoot 本地事务管理实现

    手写Spring Boot本地事务管理实现 在Spring Boot应用程序中,我们可以使用本地事务管理来保证数据的一致性和完整性。本文将详细讲解手写Spring Boot本地事务管理实现的完整攻略,并提供两个示例。 1. 配置数据源和事务管理器 以下是配置数据源和事务管理器的基本流程: 在pom.xml文件中添加以下依赖: <dependency&g…

    Java 2023年5月15日
    00
  • Java多线程、进度条实现赛马实验的示例代码

    请看下面的攻略。 Java多线程、进度条实现赛马实验的示例代码攻略 1. 基本概述 本文将着眼于如何使用Java实现一个多线程、进度条等相关功能,并以赛马模拟游戏为例,演示Java实现多线程、界面进度条样例代码的具体过程。 在Java中,提供了多线程编程的支持,可以使用Thread,Runnable等类来实现。 为了在界面上显示进度条,我们需要使用Java …

    Java 2023年5月19日
    00
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    Java复制文件的4种方式及拷贝文件到另一个目录下的实例代码 在Java中,复制文件可以使用多种方式,这里详细介绍4种常用的方法及对应的实例代码。 1. 使用 InputStream 和 OutputStream 进行复制 第一种方式是使用 InputStream 和 OutputStream,具体步骤如下: 创建 File 对象表示输入文件和输出文件; 创…

    Java 2023年5月20日
    00
  • nodejs和php实现图片访问实时处理

    下面给出一份基于nodejs和php实现图片访问实时处理的攻略。 1. 背景 随着互联网技术的快速发展,对于图片的访问和处理需求也越来越多。使用nodejs和php的组合可以满足这种需求,可以实时处理图片访问,提高网站的访问速度和用户体验。 2. 实现过程 下面详细阐述nodejs和php实现图片访问实时处理的完整攻略。 2.1 安装Node.js和PHP …

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