Spring Boot 整合JPA 数据模型关联使用操作(一对一、一对多、多对多)

下面是“Spring Boot 整合 JPA 数据模型关联使用操作(一对一、一对多、多对多)”的完整攻略。

简介

在讲解具体的操作步骤之前,我们需要先了解一些基础知识。

JPA

JPA,全称为 Java Persistence API,即 Java 持久化 API,是 Java EE 技术的一部分,是一种轻量级的 Java ORM 框架,主要是作为 Hibernate、TopLink 等 ORM 框架的规范。

数据模型关联

在开发实际应用时,一个实体类往往不是孤立地存在,它需要与其他实体类产生联系,这些联系被称为数据模型关联。常见的数据模型关联有以下几种:

  • 一对一:表示两个实体类之间的关系是一对一的,例如,“一张学生证对应一个学生”。
  • 一对多:表示一个实体类有多个相同类型的实体类与之关联,例如,“一个部门对应多个员工”。
  • 多对多:表示两个实体类之间的关系是多对多的,例如,“一个学生可以选择多门课程,一门课程可以被多个学生选择”。

Spring Boot

Spring Boot 是一个快速开发的框架,不需要进行繁琐的配置,体现了“约定优于配置”的思想。使用 Spring Boot 可以快速构建 Web 应用程序。

一对一关系

在 JPA 中,可以通过 @OneToOne 注解实现一对一关系。

创建实体类

我们以一个学生证实体类和一个学生实体类为例,来演示一对一关系。首先需要创建两个实体类,代码如下:

@Data
@Entity
@Table(name = "tb_student_card")
public class StudentCard {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "card_number")
    private String cardNumber;

    @OneToOne(mappedBy="studentCard")
    private Student student;
}
@Data
@Entity
@Table(name = "tb_student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="card_id", referencedColumnName="id")
    private StudentCard studentCard;
}

上述实体类中,@OneToOne 注解表示了这两个实体类之间的一对一关系,其中 Student 实体类中的 @JoinColumn 注解表示了与 StudentCard 实体类之间的关联关系,通过该注解可以指定外键对应的字段。

创建 DAO 层

  1. 创建继承 JpaRepository 的 StudentDao 和 StudentCardDao 接口:

```java
public interface StudentDao extends JpaRepository{}

public interface StudentCardDao extends JpaRepository{}
```

  1. 在 Service 层中进行业务操作:

```java
@Service
public class StudentService {
@Autowired
private StudentDao studentDao;
@Autowired
private StudentCardDao studentCardDao;

 public void saveStudent(Student student) {
   studentDao.save(student);
 }

 public void saveStudentCard(StudentCard studentCard) {
   studentCardDao.save(studentCard);
 }

 public void deleteStudent(Long id) {
   studentDao.deleteById(id);
 }

 public void deleteStudentCard(Long id) {
   studentCardDao.deleteById(id);
 }

}
```

创建 Controller 层

  1. 在 Controller 中调用 Service 层方法进行业务操作:

```java
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;

 @PostMapping("/saveStudent")
 public void saveStudent(@RequestBody Student student) {
   studentService.saveStudent(student);
 }

 @PostMapping("/saveStudentCard")
 public void saveStudentCard(@RequestBody StudentCard studentCard) {
   studentService.saveStudentCard(studentCard);
 }

 @DeleteMapping("/deleteStudent/{id}")
 public void deleteStudent(@PathVariable Long id) {
   studentService.deleteStudent(id);
 }

 @DeleteMapping("/deleteStudentCard/{id}")
 public void deleteStudentCard(@PathVariable Long id) {
   studentService.deleteStudentCard(id);
 }

}
```

至此,我们已经完成了一对一关系的实现。

一对多关系

在 JPA 中,可以通过 @OneToMany 和 @ManyToOne 注解实现一对多关系。

创建实体类

我们以一个部门实体类和一个员工实体类为例,来演示一对多关系。需要创建两个实体类,代码如下:

@Data
@Entity
@Table(name = "tb_department")
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees;
}
@Data
@Entity
@Table(name = "tb_employee")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "job")
    private String job;

    @ManyToOne(targetEntity = Department.class)
    @JoinColumn(name = "dept_id")
    private Department department;
}

上述实体类中,@OneToMany 注解表示了 Department 实体类和 Employee 实体类之间的一对多关系,其中 mappedBy 属性指定了关联关系的另一端属性名,是 Employee 实体类中的 department 对应的属性。@ManyToOne 注解表示了 Employee 实体类和 Department 实体类之间的多对一关系。

创建 DAO 层

创建继承 JpaRepository 的 DepartmentDao 和 EmployeeDao 接口:

public interface DepartmentDao extends JpaRepository<Department, Long>{}

public interface EmployeeDao extends JpaRepository<Employee, Long>{}

在 Service 层中进行业务操作:

@Service
public class EmployeeService {
  @Autowired
  private DepartmentDao departmentDao;
  @Autowired
  private EmployeeDao employeeDao;

  public void saveDepartment(Department department) {
    departmentDao.save(department);
  }

  public void saveEmployee(Employee employee) {
    employeeDao.save(employee);
  }

  public void deleteDepartment(Long id) {
    departmentDao.deleteById(id);
  }

  public void deleteEmployee(Long id) {
    employeeDao.deleteById(id);
  }
}

创建 Controller 层

在 Controller 中调用 Service 层方法进行业务操作:

@RestController
@RequestMapping("/employee")
public class EmployeeController {
  @Autowired
  private EmployeeService employeeService;

  @PostMapping("/saveDepartment")
  public void saveDepartment(@RequestBody Department department) {
    employeeService.saveDepartment(department);
  }

  @PostMapping("/saveEmployee")
  public void saveEmployee(@RequestBody Employee employee) {
    employeeService.saveEmployee(employee);
  }

  @DeleteMapping("/deleteDepartment/{id}")
  public void deleteDepartment(@PathVariable Long id) {
    employeeService.deleteDepartment(id);
  }

  @DeleteMapping("/deleteEmployee/{id}")
  public void deleteEmployee(@PathVariable Long id) {
    employeeService.deleteEmployee(id);
  }
}

至此,我们已经完成了一对多关系的实现。

多对多关系

在 JPA 中,可以通过 @ManyToMany 注解实现多对多关系。

创建实体类

我们以一个课程实体类和一个学生实体类为例,来演示多对多关系。需要创建两个实体类,代码如下:

@Data
@Entity
@Table(name = "tb_course")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToMany
    @JoinTable(name = "tb_course_student", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "student_id"))
    private List<Student> students;
}
@Data
@Entity
@Table(name = "tb_student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;

    @ManyToMany(mappedBy = "students")
    private List<Course> courses;
}

上述实体类中,@ManyToMany 注解表示了 Course 实体类和 Student 实体类之间的多对多关系,其中 @JoinTable 注解指定了关联关系的数据表名称,joinColumns 属性指定了与 Course 实体类关联的数据表中的字段,inverseJoinColumns 属性指定了与 Student 实体类关联的数据表中的字段。@ManyToMany 注解需要在双方实体类中都定义,并且在一方定义 mappedBy 属性。

创建 DAO 层

创建继承 JpaRepository 的 CourseDao 和 StudentDao 接口:

public interface CourseDao extends JpaRepository<Course, Long>{}

public interface StudentDao extends JpaRepository<Student, Long>{}

在 Service 层中进行业务操作:

@Service
public class CourseService {
  @Autowired
  private CourseDao courseDao;
  @Autowired
  private StudentDao studentDao;

  public void saveCourse(Course course) {
    courseDao.save(course);
  }

  public void saveStudent(Student student) {
    studentDao.save(student);
  }

  public void deleteCourse(Long id) {
    courseDao.deleteById(id);
  }

  public void deleteStudent(Long id) {
    studentDao.deleteById(id);
  }
}

创建 Controller 层

在 Controller 中调用 Service 层方法进行业务操作:

@RestController
@RequestMapping("/course")
public class CourseController {
  @Autowired
  private CourseService courseService;

  @PostMapping("/saveCourse")
  public void saveCourse(@RequestBody Course course) {
    courseService.saveCourse(course);
  }

  @PostMapping("/saveStudent")
  public void saveStudent(@RequestBody Student student) {
    courseService.saveStudent(student);
  }

  @DeleteMapping("/deleteCourse/{id}")
  public void deleteCourse(@PathVariable Long id) {
    courseService.deleteCourse(id);
  }

  @DeleteMapping("/deleteStudent/{id}")
  public void deleteStudent(@PathVariable Long id) {
    courseService.deleteStudent(id);
  }
}

至此,我们已经完成了多对多关系的实现。

以上就是关于“Spring Boot 整合 JPA 数据模型关联使用操作(一对一、一对多、多对多)”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 整合JPA 数据模型关联使用操作(一对一、一对多、多对多) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java实现万年历效果

    下面是“Java实现万年历效果”的完整攻略。 准备工作 在实现万年历之前,需要先了解一些基本知识: Java 的日期类 Date、Calendar 和 LocalDate Java 的输入输出流,包括 Scanner 和 System.out Java 的字符串拼接和格式化输出 模块化编程及测试方法 实现步骤 接下来就可以开始实现万年历了。 步骤1:获取用户…

    Java 2023年5月19日
    00
  • Java集合和数组的区别

    Java集合和数组的区别 数组的特点 数组在使用前必须要给定大小,且大小不可变。 数组可以存储基本类型和类类型,但存储类型必须一致。 数组在创建时会在内存中占用连续的空间,因此在插入或删除元素时不可避免地会牵扯到大量的数组复制操作。 下面是一个创建整数数组并赋初值的示例代码: int[] nums = new int[]{1, 2, 3, 4, 5}; 集合…

    Java 2023年5月26日
    00
  • 史上最全面的Spring Boot配置文件深入讲解

    史上最全面的Spring Boot配置文件深入讲解 Spring Boot是一个快速构建企业级应用程序的框架,它允许我们通过配置文件来快速配置和启动应用程序。在Spring Boot中,我们可以使用application.properties或application.yml等配置文件来配置应用程序的属性,以满足我们的需求。本文将深入讲解Spring Boot…

    Java 2023年5月19日
    00
  • Java 配置加载机制详解及实例

    Java 配置加载机制详解及实例 在 Java 中,配置文件被广泛用于存储应用程序的配置信息。应用程序在启动时需要读取配置文件并使用其中的参数。如果你使用 Java 编写应用程序,你需要掌握 Java 中的配置文件的加载机制。 配置文件的加载机制 Java 中的配置文件可以使用多种格式,如 .properties、.xml、.json 等。在加载配置文件时,…

    Java 2023年6月2日
    00
  • MySQL基于java实现备份表操作

    MySQL基于Java实现备份表操作的攻略主要分为以下几个步骤: 引入相关依赖 首先,我们需要在项目中引入mysql-connector-java这个库的依赖。在Maven项目中,可以在pom.xml文件中添加如下依赖: <dependency> <groupId>mysql</groupId> <artifactI…

    Java 2023年5月20日
    00
  • 类加载器有哪些种类?

    以下是关于类加载器种类的详细讲解: 类加载器有哪些种类? Java 中的类加载器可以分为几种: 启动类加载器(BootstrapLoader):负责加载 Java 的核心类库,如 rt.jar 等。 扩展类加载器(Extension ClassLoader):负责加载 Java 的扩展类库,如 jre/lib/ext 目录下的 jar 包。 应用程序类加载器…

    Java 2023年5月12日
    00
  • java 获取数据库连接的实现代码

    获取数据库连接是Java程序中与数据库交互的第一步,通常我们使用JDBC来连接数据库。下面我将提供获取数据库连接的实现代码的完整攻略。 步骤一:导入JDBC驱动 在开始使用JDBC连接数据库之前,我们首先需要导入JDBC驱动。JDBC驱动实际上就是一个Java类库,负责为Java程序提供连接数据库的能力。 以下是导入JDBC驱动的示例代码: // 第一步:导…

    Java 2023年5月19日
    00
  • 使用SpringBoot打jar包并部署到Tomcat详细步骤

    下面是使用SpringBoot打jar包并部署到Tomcat详细步骤的攻略: 准备工作 确保安装了JDK1.8及以上版本; 下载Tomcat服务器,解压到本地; 新建一个Spring Boot项目并完成基本配置。这里给出一个简单的示例:项目名为”demo”,使用的是Maven构建工具,主程序所在的包为com.example.demo,主程序名为DemoApp…

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