1. 理解 JPA 的基本概念
1.1 什么是 JPA
JPA(Java Persistence API)是 Java 平台中用于对象持久化的标准规范。持久化(Persistence)指的是将 Java 对象保存到数据库中,使其在应用程序终止后仍然存在。JPA 规范定义了一套 API,开发者可以使用这套 API 操作持久化对象和数据库之间的映射关系。
JPA 并不是一个具体的实现,而是一个标准。具体的实现通常由 ORM 框架(如 Hibernate)提供。JPA 通过定义接口和注解的方式,为 Java 应用程序和数据库的交互提供了统一的接口层。
1.2 ORM(对象关系映射)的概念
ORM(Object-Relational Mapping,对象关系映射)是将面向对象编程中的对象映射到关系型数据库的技术。通过 ORM,开发者可以将 Java 对象映射到数据库表的记录中,表中的字段与对象的属性对应,表中的行与对象的实例对应。
举个例子,假设我们有一个 User
类:
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
}
这个 User
类通过注解 @Entity
标识为一个 JPA 实体类,表示它将与数据库中的某个表进行映射。类中的字段(id
, name
, email
)则分别对应表中的列。JPA 的工作就是将这些对象持久化到数据库表中,或者从表中加载这些对象。
1.3 JPA 的核心接口
在 JPA 中,有几个核心接口和类用于处理持久化操作:
-
EntityManager:
EntityManager
是 JPA 的核心接口,负责管理实体对象的生命周期。它提供了用于增删改查实体对象的方法,例如persist()
(持久化对象)、merge()
(合并对象)、remove()
(删除对象)、find()
(查找对象)等。 -
Query :
Query
接口用于执行查询操作。可以使用 JPQL(Java Persistence Query Language)或原生 SQL 查询数据库中的数据。 -
Transaction:
Transaction
接口用于管理数据库事务。事务表示一系列操作是不可分割的,要么全执行,要么全不执行。JPA 支持显式地开始、提交或回滚事务。
1.4 EntityManager 的基础操作
-
持久化对象 (
persist
):将一个新的实体对象保存到数据库中,通常用于新增操作。User user = new User(); user.setName("John"); entityManager.persist(user);
-
合并对象 (
merge
):将一个已经存在的(未托管的)实体对象的状态同步到数据库中,适用于更新操作。user.setName("John Updated"); entityManager.merge(user);
-
删除对象 (
remove
):从数据库中删除某个对象。entityManager.remove(user);
-
查找对象 (
find
):根据主键查找对象。User user = entityManager.find(User.class, 1L);
1.5 Spring Data JPA内一般不使用EntityManager接口
Spring Data JPA 封装了大部分常见的持久化操作(如保存、查找、删除等),通过
JpaRepository
提供便捷的save()
、delete()
、findById()
等方法,通常无需直接使用EntityManager
。然而,在某些复杂场景中,EntityManager
依然非常有用,比如自定义查询、批量操作、手动管理事务、以及处理 Detached 实体。在这些情况下,你可以通过@PersistenceContext
注解注入EntityManager
来进行更灵活的控制。
2 选择 JPA 实现
2.1 常见的 JPA 实现
JPA 是一个标准,需要一个实际的实现来提供具体的功能。最常用的 JPA 实现是 Hibernate。Hibernate 是一个功能强大且灵活的 ORM 框架,支持 JPA 规范,并提供了一些扩展功能。其他 JPA 实现包括 EclipseLink 和 Apache OpenJPA 等。
Hibernate 的特点:
- 自动化:通过注解或者 XML 配置,可以自动将 Java 类映射到数据库表中。
- 查询功能强大:支持 HQL(Hibernate Query Language)、原生 SQL 和 JPQL。
- 缓存机制:Hibernate 提供一级和二级缓存,优化了数据库的访问。
- 集成广泛:Hibernate 可以与 Spring 等常见的 Java 框架无缝集成。
2.2 配置 Hibernate 作为 JPA 实现
在 Spring Boot 项目中,使用 Hibernate 作为 JPA 实现非常简单。只需引入相关依赖,Spring Boot 会自动完成大部分配置工作。
-
引入依赖
在你的pom.xml
文件中添加 Spring Data JPA 的依赖。你不需要单独添加 Hibernate 依赖,因为 Spring Boot 已经为你处理了 Hibernate 作为 JPA 实现的集成。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
-
自动配置 Hibernate
当你添加了
spring-boot-starter-data-jpa
依赖后,Spring Boot 会自动配置 Hibernate 作为默认的 JPA 实现。Spring Boot 会自动扫描带有@Entity
注解的类,并为你配置EntityManagerFactory
和JpaTransactionManager
。 -
数据库连接配置
你只需在application.properties
或application.yml
文件中提供数据库连接信息,Spring Boot 会基于这些信息自动配置数据源和 Hibernate。spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
-
定义实体类和持久化接口
定义 JPA 实体类,并通过 Spring Data JPA 提供的JpaRepository
接口执行数据库操作。你不需要手动实现增删改查方法,Spring Data JPA 会自动生成这些方法。@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; } public interface UserRepository extends JpaRepository<User, Long> { }
-
使用 JPA 进行数据库操作
在服务类中注入UserRepository
,并通过它执行数据库的持久化操作。
-
@Service public class UserService { @Autowired private UserRepository userRepository; public void saveUser(User user) { userRepository.save(user); } public List<User> getAllUsers() { return userRepository.findAll(); } }
通过引入
spring-boot-starter-data-jpa
依赖,Spring Boot 会自动配置 Hibernate 作为 JPA 实现。你只需专注于数据库连接配置和实体类的定义,其余的持久化操作和配置由 Spring Boot 自动完成,极大地简化了开发流程。