JPA规范

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 中,有几个核心接口和类用于处理持久化操作:

  • EntityManagerEntityManager 是 JPA 的核心接口,负责管理实体对象的生命周期。它提供了用于增删改查实体对象的方法,例如 persist()(持久化对象)、merge()(合并对象)、remove()(删除对象)、find()(查找对象)等。

  • Query Query 接口用于执行查询操作。可以使用 JPQL(Java Persistence Query Language)或原生 SQL 查询数据库中的数据。

  • TransactionTransaction 接口用于管理数据库事务。事务表示一系列操作是不可分割的,要么全执行,要么全不执行。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 会自动完成大部分配置工作。

  1. 引入依赖
    在你的 pom.xml 文件中添加 Spring Data JPA 的依赖。你不需要单独添加 Hibernate 依赖,因为 Spring Boot 已经为你处理了 Hibernate 作为 JPA 实现的集成。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
  2. 自动配置 Hibernate

    当你添加了 spring-boot-starter-data-jpa 依赖后,Spring Boot 会自动配置 Hibernate 作为默认的 JPA 实现。Spring Boot 会自动扫描带有 @Entity 注解的类,并为你配置 EntityManagerFactoryJpaTransactionManager

  3. 数据库连接配置
    你只需在 application.propertiesapplication.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
    
  4. 定义实体类和持久化接口
    定义 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> {
    }
    
  5. 使用 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 自动完成,极大地简化了开发流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值