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日

相关文章

  • Spring Boot如何支持嵌入式Servlet容器

    Spring Boot是一个开源框架,它可以帮助我们使用Java Spring框架更快速的创建和运行应用程序。其中一个Spring Boot的特性是支持嵌入式Servlet容器,这使得我们可以很容易地部署应用程序,无需安装Web服务器。 Spring Boot支持三个嵌入式Servlet容器:Tomcat、Jetty和Undertow。以下是如何使用Spri…

    Java 2023年6月15日
    00
  • SpringBoot和Redis实现Token权限认证的实例讲解

    下面我会为您介绍如何使用Spring Boot和Redis实现Token权限认证。 为什么使用Token认证? 在Web应用程序中,为了保护页面和API,需要用户进行登录并验证其身份。其中一种常用的方法是使用Token认证。在Token认证中,用户首先输入用户名和密码进行登录,验证成功后,服务器会返回一个Token令牌,将其存储在客户端。随后,客户端将该To…

    Java 2023年5月20日
    00
  • Java代码优化的作用是什么?

    Java代码优化指的是对Java程序进行分析和调整,以减少资源消耗、提高程序性能和扩展性。代码优化的目的是让程序更快、更节省资源、更易于维护和扩展。下面是Java代码优化的应用攻略: 第一步:性能分析 Java代码的性能才是我们关注的重点,因此我们需要分析程序,找到程序的瓶颈。可以使用一些工具来分析程序的性能,如JProfiler和Java Mission …

    Java 2023年5月11日
    00
  • Apache POI将PPT转换成图片实例代码

    下面就来详细讲解“Apache POI将PPT转换成图片实例代码”的完整攻略。 简介 Apache POI是一个开源的Java库,用于处理Microsoft Office文档格式,如PPT、XLS和DOC等格式。本文将针对PPT格式文件,介绍如何使用Apache POI将PPT转换成图片。 准备工作 在使用Apache POI之前,首先需要进行一些准备工作。…

    Java 2023年5月20日
    00
  • java时间段查询将00:00:00更换成23:59:59

    针对Java时间段查询将00:00:00更换成23:59:59的问题,我可以提供以下攻略: 方法一:使用时间处理类 在Java中,可以使用Java提供的时间处理类来实现将时间段的起始时间和结束时间从00:00:00和23:59:59的时间戳互相转换,具体实现步骤如下: 首先,定义起始时间和结束时间的字符串,如下所示: String startTimeStr …

    Java 2023年5月20日
    00
  • Java统计一个字符串在另外一个字符串出现次数的方法

    当需要统计一个字符串在另外一个字符串中出现的次数时,可以使用Java中的字符串处理方法来实现。下面将具体讲解如何进行操作。 一、先了解Java中的字符串方法 Java中的字符串类提供了一个indexOf(String str)方法,可以在一个字符串中查找指定的子串,并返回其在字符串中第一次出现的位置。如果查找不到目标字符串,则返回-1。 此外,还有一个类似的…

    Java 2023年5月27日
    00
  • HTML相关知识点总结

    HTML相关知识点总结 什么是HTML? HTML(Hypertext Markup Language)是一种用于创建Web页面的标准标记语言。它使用标记标识文本、图片、链接和其他内容,告诉Web浏览器如何组织和显示页面。 HTML基础结构 HTML文档通常包括以下结构: <!DOCTYPE html> <html> <head…

    Java 2023年5月26日
    00
  • SpringMVC请求参数的使用总结

    SpringMVC请求参数的使用总结 在 SpringMVC 中,我们经常需要获取请求参数,包括 GET 请求和 POST 请求。本文将详细讲解 SpringMVC 请求参数的使用,包括如何获取 GET 请求参数、POST 请求参数、路径参数和请求头参数,并提供两个示例说明。 获取 GET 请求参数 在 SpringMVC 中,我们可以使用 @Request…

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