在 Java 持久化 API (JPA) 中,多对多映射定义了一种关系,其中一个实体的多个实例与另一个实体的多个实例相关联。在关系型数据库中,这通常通过一个连接表来实现,该表包含引用两个实体主键的外键。
理解多对多映射
在多对多关系中:
- 一名学生可以注册多门课程。
- 一门课程可以有多名学生。
在 JPA 中,我们通过 @ManyToMany 注解来实现这一点,通常会结合 @JoinTable 来定义连接表。
在 JPA 中实现多对多映射的步骤
1. 定义实体
让我们创建两个实体:Student 和 Course。每个实体都维护一个引用另一侧的集合。
Student 实体:
Java
CODEBLOCK_d45e5ddd
- @ManyToMany(mappedBy = "students") 注解将这一侧设置为关系的反向端(Inverse Side)。
- courses 字段映射到 Course 实体中定义的拥有端。
Course 实体:
Java
CODEBLOCK_cb1d7584
- @JoinTable 定义了连接表的名称(course_student)。
- joinColumns 代表 Course 的外键。
- inverseJoinColumns 代表 Student 的外键。
2. 配置持久化单元
在 persistence.xml 中,我们需要配置数据库连接和实体类。
XML
CODEBLOCK_71d8884e
这个文件注册了实体类,并为 JPA 和 Hibernate 设置了数据库连接。
项目结构:
3. 创建服务层类
#### StudentService.java:
Java
CODEBLOCK_e80e219a
CourseService.java:
Java
“
package service;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import model.Course;
import java.util.List;
public class CourseService {
private final EntityManager entityManager;
public CourseService(EntityManager entityManager) {
this.entityManager = entityManager;
}
public List getAllCourses() {
return entityManager.createQuery("SELECT c FROM Course c", Course.class).getResultList();
}
public Course saveCourse(Course course) {
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(course);
transaction.commit();