首页 > 解决方案 > Spring Boot:如何使用 Repository 分别保持一对多关系

问题描述

我有两个班级,部门员工。他们是一对多的关系,即一个部门可以有很多员工。

没有部门,员工就无法存在。
部门可以有 0 到 n 名员工。

我得到了这两个项目的列表......这些列表可以包含新条目和更新的条目。

我的问题是,我该怎么做?

  1. 独立保存/合并部门
  2. 在步骤 1 之后独立保存/合并员工(确保员工拥有的部门 ID 存在于部门表中)

或者

  1. 保存/合并部门与Set<>员工?

或者

还有另一种我还没有想到的方法吗?

标签: springhibernatespring-bootspring-data-jpa

解决方案


有两种模式称为“存储库”和“聚合”,它们来自 Eric Evans领域驱动设计一书,使用其中一种是最佳实践。

存储库模式

  • 两个独立的实体(部门和员工)
  • @OneToMany实体之间没有 JPA 关系 ( )
  • employee只包含它的departmentId字段
  • 两个存储库 ( departmentRepo, employeeRepo)

如果你必须得到员工的部门,它应该是这样的:

department = departmentRepo.findById(employee.departmentId)

保存实体也独立使用其存储库完成:

newDepartment = departmentRepo.save(new Department())
newEmployee = employeeRepo.save(new Employee(newDepartment.id))

聚合模式

不像两个存储库和实体之间没有连接聚合模式使用:

  • 一个存储库(departmentRepo在这种情况下)
  • department实体@OneToManyemployees(部门包含员工)有联系。

在这种情况下,要获取员工,您必须使用部门存储库:

employees = departmentRepo.findById(departmentId).employees

保存同样的事情:您应该保存部门以保存员工的更改。

回顾

这些模式的任何混合(最常见:实体之间的两个 repos 和 JPA 关系)都会在未来导致非常难以维护的问题。

在大多数情况下,我更喜欢存储库模式:每个实体都有存储库,并且实体之间没有关系。

在您的情况下,我会选择存储库模式。


推荐阅读