JPA的实现原理与使用方式是怎样的?

2 个回答

  • 周芷若
    看山,看水,看众生,也看自己。
    # 作用 - JPA(Java Persistence API)是 Java EE/Jakarta EE 中的持久化规范,用于通过对象/关系映射(ORM)管理关系数据库中的数据。 - 它提供标准的实体映射、持久化操作和查询能力,使应用可以用面向对象的方式访问数据库,而不是直接编写大量 JDBC 代码。 - JPA 本身只是规范,具体能力由兼容的 ORM 实现提供;该文档中的实现组合包括: - **Hibernate Core**:负责对象/关系映射、持久化核心能力。 - **Hibernate EntityManager**:提供 JPA 标准 API 的实现。 # 原理 - 应用定义带映射注解的实体类,将 Java 类、属性与数据库表、字段对应起来。 - JPA 通过 `EntityManager` 操作实体的生命周期,完成增删改查等持久化操作。 - 底层 ORM 实现根据实体映射信息生成并执行 SQL,把数据库记录转换成 Java 对象,也把对象变更同步回数据库。 - 可通过配置文件描述数据源、持久化单元、ORM 实现参数以及映射信息。 - Hibernate 还支持第二级缓存,用于缓存持久化数据,减少数据库访问。 # 使用方式 1. **创建 JPA 应用** - 编写实体类。 - 配置持久化单元和数据库连接。 - 通过 JPA API 获取并使用 `EntityManager`。 2. **配置 Hibernate** - 设置数据库连接、映射、SQL 行为等参数。 - 可根据需要配置 Hibernate 的第二级缓存。 3. **使用注解映射实体** - 使用 JPA/Hibernate 注解声明实体、表、字段、主键及实体关系。 4. **执行查询** - 可使用 Hibernate Query Language(HQL)编写面向实体模型的查询。 - HQL 支持常见的 `FROM`、排序、条件谓词、批量更新/删除、集合成员引用、路径表达式、标量函数、字符串拼接以及动态实例化等能力。 - HQL 查询由 Hibernate 转换为适用于底层数据库的 SQL。
    发布于 2026-10-27 11:35 •IP属地 河北
    举报
    评论
    收藏

  • 鬼木
    世间行乐亦如此,古来万事东流水。
    ## 作用 - **JPA(Java Persistence API)** 是 Java 官方定义的 **ORM 持久化标准规范**,不是 Spring 提供的 API。 - 它位于应用程序与 JDBC 之间:应用程序调用 JPA,JPA 底层通过 JDBC 生成并执行 SQL,最终访问关系型数据库。 - ORM(Object Relational Mapping)负责把 **Java 对象与数据库表进行映射**,使开发者可以通过操作实体对象完成 CRUD,而不必大量手写 SQL。 - 常见 JPA 实现包括: - **Hibernate**:最常用,Spring Boot 默认集成; - **EclipseLink**; - **DataNucleus**。 ### 主要优势 - **面向对象开发**:以实体类为中心,而不是以 SQL 和表结构为中心。 - **提升开发效率**:通过 `save`、`findById`、`delete` 等方法完成常见数据操作。 - **降低维护成本**:表结构变化时,通常主要修改实体类字段,由框架生成 SQL。 - **支持缓存**:可利用持久化上下文一级缓存以及可配置的二级缓存减少重复查询。 ### 适用边界 - 适合普通 CRUD、实时查询等场景。 - 对复杂报表、统计分析、大量聚合和复杂多表关联查询,JPA 可能不够灵活。 - 这类场景可以使用 MyBatis 等手写 SQL 的 Mapper 方案。 - 在 Spring 中,JPA 与 MyBatis 可以同时使用:简单业务用 JPA,复杂查询用 MyBatis。 ## 原理 ### 1. 基本调用链路 ```text 应用程序 ↓ 使用 JPA API JPA 标准接口 ↓ 由 Hibernate 等实现处理 Hibernate ↓ 生成 SQL JDBC ↓ 关系型数据库 ``` 在 Spring Boot 中引入: ```gradle implementation 'org.springframework.boot:spring-boot-starter-data-jpa' ``` 该依赖会默认引入: - Spring Data JPA; - Hibernate; - JDBC 相关组件; - HikariCP 数据库连接池等。 ### 2. Spring Boot 自动装配 启动类上的 `@SpringBootApplication` 会触发自动配置。引入 `spring-boot-starter-data-jpa` 后,Spring Boot 会自动完成 JPA 相关组件的装配,例如: - `EntityManagerFactory`; - `TransactionManager`; - Repository 代理 Bean; - Hibernate 相关配置。 因此,开发者定义的 `@Entity` 实体类和 Repository 接口可以被 Spring 容器管理,并在运行时由 Hibernate 转换为 SQL。 ### 3. Repository 的工作方式 Web 请求的大致调用过程是: 1. `DispatcherServlet` 接收请求; 2. 根据映射找到对应的 Controller; 3. Controller 调用 Service; 4. Service 调用 Repository,例如 `JpaRepository<T, ID>`; 5. Spring Data JPA 根据方法名生成查询逻辑,例如 `findByOrderId`; 6. 底层通过 `EntityManager` 调用 Hibernate; 7. Hibernate 生成 SQL,再通过 JDBC 访问数据库。 ### 4. 持久化上下文与脏检查 JPA 通过 **持久化上下文(Persistence Context)** 管理实体对象。 实体被查询出来后,会处于持久化上下文中,并保存一份初始状态快照。事务提交时,JPA 会比较: - 实体当前状态; - 查询时保存的快照状态。 如果发现字段发生变化,就自动生成并执行 `update` 语句,这个机制称为 **脏检查(Dirty Checking)**。 示例流程: ```java @Transactional public void cancelOrder(Long orderId) { Order order = orderRepository.findById(orderId).orElseThrow(); order.cancel(); } ``` 执行过程: 1. 事务开始; 2. 查询订单实体; 3. 持久化上下文保存实体的初始快照; 4. 调用 `order.cancel()` 修改实体状态; 5. 事务提交时比较快照和当前对象; 6. 如果发现变化,自动生成 update SQL; 7. 通过 JDBC 将变更同步到数据库。 脏检查只对持久化上下文管理的实体生效,`transient`(瞬态)和 `detached`(脱管)实体的修改不会被自动同步。 默认情况下,脏检查可能更新实体的全部字段;如果字段很多,可以考虑使用动态更新相关配置,只更新发生变化的字段。
    发布于 2026-10-24 18:03 •IP属地 湖南
    举报
    评论
    收藏