- Spring Boot ORM 教程
- Spring Boot ORM - 首页
- Spring Boot ORM - 概述
- 环境设置
- Spring Boot ORM - JPA
- Spring Boot ORM & Spring Data JPA
- Spring Boot ORM - 创建项目
- Application.properties
- Spring Boot ORM - 更新项目
- Spring Boot ORM - 测试Hibernate
- Spring Boot ORM & EclipseLink
- Maven EclipseLink
- 更新项目 EclipseLink
- Spring Boot ORM - 测试 EclipseLink
- Spring Boot ORM 有用资源
- Spring Boot ORM - 快速指南
- Spring Boot ORM - 有用资源
- Spring Boot ORM - 讨论
Spring Boot ORM - JPA
Java 持久性 API (JPA) 是一组类和接口,允许将 Java 对象与数据库进行对象/关系映射。在 JPA 中,实体类在persistence.xml文件中定义。Spring Boot 不使用persistence.xml。相反,它使用“实体扫描”,这是一个查找并将实体类注册到持久性提供程序的过程。
什么是实体扫描?
实体发现 - 当提供程序找到带有@Entity注释的类时,它会将其识别为持久性实体并将其注册。
持久单元 - 然后将发现的实体与持久单元关联,持久单元定义由单个EntityManager管理的一组实体。
扫描包 - JPA 提供程序扫描指定的包或目录,查找用@Entity注释的类。
默认情况下会扫描自动配置的包。
在 Spring Boot 中配置实体扫描
默认扫描 - 默认情况下,Spring Boot 扫描主应用程序类的包及其子包中的实体类。
自定义扫描 - 你可以使用 @EntityScan 注解来指定要扫描的包。例如
@SpringBootApplication @EntityScan(basePackages = {"com.example.entities"}) public class Application { // ... }
Spring Data JPA 仓库
Spring Data JPA 实现用于访问数据库(关系型、NoSQL 或其他任何类型)数据的接口。Spring Data 仓库扩展自Repository或CrudRepository。
@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; } }