JPA (Java Persistence API) 是一种 Java 对象关系映射(ORM)标准,它允许开发者通过 Java 面向对象编程的方式来操作数据库,而无需直接编写 SQL 语句。JPA 提供了统一的接口和规范,使得不同的数据库管理系统(如 Oracle、MySQL、PostgreSQL 等)能够以统一的方式被访问。
JPA 的主要组件包括:
- EntityManager:它是 JPA 的核心部分,用于管理实体对象生命周期、查询数据库以及事务处理。
- Entity 和 @Entity 注解:表示数据表的实体类,包含字段映射到表列,关系映射等信息。
- Query 和 Criteria API:用于执行复杂的查询操作,提供了一种声明式查询机制。
- Metamodel:描述了 Entity 类和它们的关系,不需要显式创建数据库结构。
使用 JPA,开发者可以编写类似下面这样的代码:
// 创建 EntityManager 实例 EntityManager em = entityManagerFactory.createEntityManager(); // 查询操作 List<User> users = em.createQuery("SELECT u FROM User u", User.class).getResultList(); // 保存或更新数据 User user = new User(); user.setName("John"); em.persist(user); // 提交事务 em.getTransaction().commit();
JPA 通过 EntityManager
来处理数据库事务。在 JPA 中,你可以使用以下几种方式进行事务控制:
- 手动事务管理:
beginTransaction()
:开始一个新的事务。commit()
:提交事务,如果所有操作都成功完成。rollback()
:回滚事务,当发生异常或错误时。
try {
EntityManager em = ...;
em.getTransaction().begin(); // 执行数据库操作 // 如果没有异常... em.getTransaction().commit();
} catch (Exception e) {
if (em.getTransaction() != null) {
em.getTransaction().rollback(); =} throw e;
}
- 声明式事务管理: Spring Boot 可以通过
@Transactional
注解自动管理事务,简化了配置过程。只需要将@Transactional
应用于需要事务的方法上。
@Transactional
public void someBusinessMethod() { // 这里的所有数据库操作都会在事务范围内 }
在事务结束时,Spring 会根据业务方法的执行结果自动提交或回滚事务。
@OneToMany
是 Java Persistence API (JPA) 中的一个关联映射注解,它用于一对多的关系,即一个实体可以拥有多条属于另一个实体的数据。通常用于表示一个“拥有者”类(也叫父实体)与一组“被拥有者”类(子实体)之间的联系。
例如,在学生-课程的关系中,一个学生可以有多个课程,这时可以在学生实体上添加 @OneToMany
注解,指向课程实体:
@Entity public class Student {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "student")
private List<Course> courses;
}
@Entity
public class Course {
@Id
private Long id;
private String courseName;
@ManyToOne @JoinColumn(name = "student_id") // 关联到Student表的id字段
private Student student; // mappedBy属性告诉JPA我们是在学生这一端设置关联
}
在这里,courses
是一个集合,每个 Course
实例都有一个关联的 student
属性。当我们保存或更新 Student
对象时,JPA会自动维护与其关联的 Course
对象列表。