**JPA(Java Persistence API)基础** Java Persistence API是Java平台上的一个标准接口,用于处理对象持久化到数据库的过程。它是Java EE和Spring框架中的一部分,简化了开发人员与数据库之间的交互,使得开发者无需直接编写SQL语句即可完成数据操作。JPA通过ORM(Object-Relational Mapping)技术将Java对象映射到关系数据库中的表,从而实现对象与数据库的解耦。 ### JPA的核心概念 1. **实体(Entity)**:在JPA中,实体代表数据库中的表,由`@Entity`注解标识。实体类通常是Java POJO(Plain Old Java Object),它的实例对应数据库表的一行记录。 2. **实体管理器(EntityManager)**:是JPA的核心组件,负责创建、查询和管理实体对象。它提供了保存、更新、删除实体以及执行查询操作的方法。 3. **实体管理工厂(EntityManagerFactory)**:用于创建实体管理器实例,是JPA的配置中心,通常在应用启动时创建并缓存,避免频繁创建和销毁。 4. **持久化上下文(Persistence Context)**:是实体管理器内部的一个概念,管理着当前会话中的实体状态。在持久化上下文中,实体的状态变化会被自动同步到数据库。 ### JPA的基本操作 1. **创建(CRUD)**: - **保存(Persist)**:`entityManager.persist(entity)`,将新实体插入数据库。 - **更新(Merge)**:`entityManager.merge(entity)`,更新已存在的实体。 - **删除(Remove)**:`entityManager.remove(entity)`,从数据库中删除实体。 - **查询(Find)**:`entityManager.find(Entity.class, id)`,根据ID查找实体。 2. **查询语言(JPQL,Java Persistence Query Language)**: - JPQL是一种面向对象的查询语言,类似于SQL但操作对象而非记录。例如,`SELECT e FROM Entity e WHERE e.name = 'John'`。 3. ** Criteria 查询**: - JPA还提供了一种基于Java API的查询方式,允许动态构建查询,更具灵活性。 ### JPA的事务管理 1. **自动事务**:JPA支持容器管理的事务(CMT)和应用程序管理的事务(BMT)。CMT由Java EE容器负责事务的开启、提交和回滚;BMT则由开发者在代码中手动控制。 2. **事务隔离级别**:JPA遵循数据库的四种事务隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。 ### JPA的关联映射 1. **一对一(OneToOne)**:一个实体对应数据库表中的另一行记录。使用`@OneToOne`注解,可以设置外键约束和关联的导航属性。 2. **一对多(OneToMany)**:一个实体可以对应多个其他实体,如用户与订单的关系。使用`@OneToMany`注解,并通过`mappedBy`指定被关联方。 3. **多对一(ManyToOne)**:多个实体对应一个实体,与一对一关系相反。使用`@ManyToOne`注解。 4. **多对多(ManyToMany)**:多个实体对应多个其他实体,如学生与课程的关系。使用`@ManyToMany`注解,通常需要一个关联表来存储中间关系。 ### JPA的继承策略 JPA提供了三种继承策略: - **单表继承(Single Table Inheritance)**:所有子类信息存储在同一张表中,使用`@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`。 - **联合继承(Joined Table Inheritance)**:每个子类有自己的表,父类信息存储在一个公共表中,使用`@Inheritance(strategy=InheritanceType.JOINED)`。 - **表分区继承(Table Per Class Inheritance)**:每个子类都有自己的表,父类没有表,使用`@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)`。 ### JPA的懒加载和级联操作 1. **懒加载(Lazy Loading)**:默认情况下,关联对象在需要时才加载,以提高性能。使用`@OneToMany(mappedBy="...", fetch FetchType.LAZY)`或`@ManyToOne(fetch FetchType.LAZY)`启用。 2. **级联操作(Cascade)**:通过`cascade=CascadeType.ALL`等值,可以使实体的保存、更新、删除操作影响到关联的实体。 ### JPA的索引和唯一性约束 1. **索引(Index)**:可以使用`@Column(index=true)`在列上创建数据库索引,提升查询效率。 2. **唯一性约束(Unique Constraint)**:`@Column(unique=true)`确保字段值的唯一性。 ### 总结 JPA作为Java平台上的ORM框架,通过面向对象的方式来处理数据库操作,降低了开发复杂度,提高了代码可维护性。了解并熟练掌握JPA的基本概念、操作、关联映射和事务管理,对于Java开发者而言至关重要,能有效提升开发效率和项目质量。
- 粉丝: 20
- 资源: 4590
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助