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;
   }
}
廣告