创建后端 API 时,通常使用实体关系来组织数据。通常,在课程或教程中,我们主要看到双向关系。但是,如果您希望一个实体独立于另一个实体存在,该怎么办?在本文中,我们将探讨如何使用 JPA/Hibernate 的单向关系来实现这一点。
目录
- 上下文和问题
- 实体建模
- 保存数据的方案
- 创建没有 ThesisSchedule 的学生
- 更新学生以与 ThesisSchedule 关联
- 管理学生关系的优势
- 备选方案:管理 ThesisSchedule 端的关系
- 选择适合您需求的配置
背景和问题:
假设您有两个实体:Student 和 ThesisSchedule。Student 和 ThesisSchedule 之间的关系是“多对一”的,这意味着一个学生可以与一个论文计划相关联,并且每个计划可以包含多个学生。
在这种情况下,我们的目标是允许创建 Student ,而无需先定义 ThesisSchedule。例如,在创建论文时间表之前将学生添加到数据库时,这种独立性非常有用。
- 遇到问题:对于双向或配置不当的关系,如果尚未创建 ThesisSchedule,则创建 Student 可能会失败,即使使用批注 nullable = true。让我们看看如何用单向关系来解决这个问题。
实体建模
我们将使用从 Student 到 ThesisSchedule 的单向“多对一”关系创建 Student 和 ThesisSchedule 类。
Student
实体代码:
ThesisShedule
实体代码:
在这里,我们有一个从 Student 到 ThesisSchedule 的单向关系,由 Student 类中的 @ManyToOne 注释表示。通过指定 nullable = true,我们允许创建 Student 而不必与 ThesisSchedule 关联。
保存数据的方案
让我们看看此设置如何转换为数据库,以及如何通过 API 保存数据。
创建没有 ThesisSchedule 的学生
通过此设置,我们可以在不提供 ThesisSchedule 的情况下创建学生。
创建 Student 的 POST 请求(不带 ThesisSchedule):
这将在 Student 表中创建一个新条目,其中 thesis_schedule_id 列的值为 null。
结果:
更新学生以与 ThesisSchedule 关联
创建 ThesisSchedule 后,我们可以更新 Student 记录以与之关联。
创建 ThesisSchedule:
此新创建的 ThesisSchedule 的 ID 可能为 1。
使用 ThesisSchedule 更新学生:
结果:
现在,Larose 与新创建的 ThesisSchedule 相关联。
管理学生关系的优势:
- 创建灵活性:我们可以独立于 ThesisSchedule 创建 Student,从而允许创建独立的实体。
- 结构的简单性:单向关系简化了交互,因为 ThesisSchedule 不需要知道与 Student 的关系。
- 可伸缩性:如果以后需要使这种关系是双向的,我们可以更新 ThesisSchedule 类以包含 Student 的集合。
备选方案:管理 ThesisSchedule 端的关系
在某些情况下,从 ThesisSchedule 端管理关系可能更合适。如果我们希望论文时间表管理其关联的学生,并跟踪参与特定时间表的学生,则此方法很有用。
实体建模
在此设置中,ThesisSchedule 保存 Student 的集合来表示“一对多”关系,而 Student 不维护对 ThesisSchedule 的引用。
ThesisSchedule
实体代码:
Student
实体代码:
在此配置中,ThesisSchedule 通过 @OneToMany 注释包含 Student 列表。因此,可以在 ThesisSchedule 中添加或删除学生,而无需在 Student 中直接链接。
在 ThesisSchedule 方面管理关系的优势:
- 数据集中化:与论文时间表相关的学生的所有信息都集中在 ThesisSchedule 中,从而更容易访问相关数据。
- 增加控制: ThesisSchedule 可以管理其学生,从而简化对参与相同时间表的学生群体的处理。
根据您的需求选择正确的配置:
总之,是否在 Student 或 ThesisSchedule 端管理关系取决于应用程序的特定需求:
- 由学生管理的关系:如果要独立于论文计划创建学生,并在以后选择将计划链接到学生,请使用此设置。
- 由 ThesisSchedule 管理的关系:如果论文计划应管理其学生,使其成为实体之间关系的核心,则此选项更可取。
这两种配置都提供了灵活性,并允许根据所需的数据关系创建组织良好的后端 API。通过应用最佳实践来构建实体关系,您可以有效地对数据库进行建模以满足应用程序的特定需求。
单向关系是管理后端 API 中实体之间的可选依赖关系的强大选项。