Spring Boot ORM - JPA



Java 持久性 API (JPA) 是一组类和接口,允许将 Java 对象与数据库进行对象/关系映射。在 JPA 中,实体类在persistence.xml文件中定义。Spring Boot 不使用persistence.xml。相反,它使用“实体扫描”,这是一个查找并将实体类注册到持久性提供程序的过程。

什么是实体扫描?

    扫描包 - JPA 提供程序扫描指定的包或目录,查找用@Entity注释的类。

  • 实体发现 - 当提供程序找到带有@Entity注释的类时,它会将其识别为持久性实体并将其注册。

  • 持久单元 - 然后将发现的实体与持久单元关联,持久单元定义由单个EntityManager管理的一组实体。

默认情况下会扫描自动配置的包。

在 Spring Boot 中配置实体扫描

  • 默认扫描 - 默认情况下,Spring Boot 扫描主应用程序类的包及其子包中的实体类。

  • 自定义扫描 - 你可以使用 @EntityScan 注解来指定要扫描的包。例如

    @SpringBootApplication
    @EntityScan(basePackages = {"com.example.entities"})
    public class Application {
       // ...
    }
    

Spring Data JPA 仓库

Spring Data JPA 实现用于访问数据库(关系型、NoSQL 或其他任何类型)数据的接口。Spring Data 仓库扩展自RepositoryCrudRepository

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer>  {
}

创建和删除数据库

如果你使用嵌入式数据库(如 H2、Derby),JPA 数据库会自动创建。要创建和删除表,你的 application.properties 应该如下所示:

spring.jpa.hibernate.ddl-auto=create-drop

映射类之间的关联

关联映射可以分为两种类型:

  • 单向关联 - 在这种关联中,只有一个实体持有对另一个实体的引用。例如,一对多或多对一关系。

  • 双向关联 - 在双向关联中,两个实体(源和目标)都具有一个相互引用的关系字段。例如,多对多关系。

一对多关系(单向)

想象一下部门实体及其员工。每个部门都有许多员工,但每个员工只属于一个部门。

Department.java

package com.tutorialspoint;

import javax.persistence.*;
import java.util.*;

@Entity
public class Department {
   @Id
   private Long id;

   @OneToMany
   @JoinColumn(name = "department_id")
   private List<Employee> employees;

   public Department() {}

   public Long getId() {
      return id;
   }

   public void setId(Long id) {
      this.id = id;
   }
   public List<Employee> getEmployees() {
      return employees;
   }
   public void setEmployees(List<Employee> employees) {
      this.employees = employees;
   }
}

Employee.java

package com.tutorialspoint;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {
   @Id
   private Long id;

   public Long getId() {
      return id;
   }

   public void setId(Long id) {
      this.id = id;
   }
}

多对一关系(单向)

考虑一下学生学校。每个学生只能在一个学校注册,但每个学校可以有多个学生。

Student.java

package com.tutorialspoint;

import javax.persistence.*;

@Entity
public class Student {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;
   private String name;

   @ManyToOne
   @JoinColumn(name = "school_id")
   private School school;

   public Long getId() {
      return id;
   }
   public void setId(Long id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public School getSchool() {
      return school;
   }
   public void setSchool(School school) {
      this.school = school;
   }
}

School.java

package com.tutorialspoint;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.List;

@Entity
public class School {
   @Id
   private Long id;
   private List<Student> students;
	
   public Long getId() {
      return id;
   }
   public void setId(Long id) {
      this.id = id;
   }
   public List<Student> getStudents() {
      return students;
   }
   public void setStudents(List<Student> students) {
      this.students = students;
   }
}

多对多关系(双向)

在双向关联中,两个实体(源和目标)都具有一个相互引用的关系字段。想象一下书籍和作者。每本书都有一个作者,但每个作者可以写多本书。

Book.java

package com.tutorialspoint;

import javax.persistence.*;

@Entity
public class Book {
   @Id
   private Long id;
   private String title;

   @ManyToOne
   @JoinColumn(name = "author_id")
   private Author author;
   
   public Long getId() {
      return id;
   }
   public void setId(Long id) {
      this.id = id;
   }
   public String getTitle() {
      return title;
   }
   public void setTitle(String title) {
      this.title = title;
   }
   public Author getAuthor() {
      return author;
   }
   public void setAuthor(Author author) {
      this.author = author;
   }
}

Author.java

package com.tutorialspoint;

import javax.persistence.*;
import java.util.List;

@Entity
public class Author {

   @Id
   private Long id;
   private String name;
   
   @OneToMany(mappedBy = "author")
   private List<Book> books;

   public Long getId() {
      return id;
   }
   public void setId(Long id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public List<Book> getBooks() {
      return books;
   }
   public void setBooks(List<Book> books) {
      this.books = books;
   }
}
广告